用户密码加密存储
ddatsh
看似简单?
DB权限管理十分严格,敏感信息开发工程师都看不到,密码明文存储行不行?
不行
数据面临很多威胁,程序、数据库、OS、机房、员工,百分百不被窃取非常困难
密码加密存储,即便被拖库,也难以获取明文密码。密码加密存储是底裤,重要性相当于独自出远门时缝在内衣里钱,虽然用到的概率不大,但关键时刻他们能救命
用加密算法如AES把密码加密再存,需要明文的时候再解密就安全?
不
怎么安全保存用来加密解密的密钥?
虽业界有成熟的、软硬件密钥存储方案。但密码值一样,想要密钥百分百不泄露也不可能
但密钥一泄露,明文密码也就泄露
把加密密码变成存密码的HASH值,MD5就可以?
不是所有的HASH算法都可以,应该用Cryptographic Hash
- 任意大小输入,计算hash非常快
- 单向hash
- 输入很小改动,hash很大变化
- 无碰撞
Cryptographic Hash有(MD5、SHA-1已破不安全)、SHA-2、SHA-3/Keccak、BLAKE2
存成密码的SHA256值?
不
查询表或彩虹表破解
避免彩虹表攻击
简单讲就是加盐
原来存key的hash值HASH(key),现在存HASH(key+salt)
提前计算生成的彩虹表,全失效
盐应怎么生成,不是简单随机字符串
用CSPRNG(Cryptographically Secure Pseudo-Random Number Generator),而不是普通随机数算法
比C标准库里rand()更随机,不可预测
盐不能太短
密码+盐的所有组合建立彩虹表
盐不能重复使用
每条数据应用随机生成的不同盐,且每次保存新密码时,再生成一个新的盐
自行设计HASH算法?
不可以
柯克霍夫原则或者香农公里:
密码系统应该就算被所有人知道系统的运作步骤,仍然是安全的
每密码加不同高质量的盐,HASH保存结束?
以前可以,现在GPU集群算sha256,每秒10亿次以上。暴力破解密码成为可能,不再依赖查询表或彩虹表,定制过硬件和专用算法,直接计算每一种可能,实时破解
Cryptographic Hash特性第一条:
给定任意大小任意类型的输入,计算hash非常快
Cryptographic Hash并不是为加密密码而设计的,计算非常快特性其他应用场景非常有用,现在硬件条件下,加密密码就显得不合适了
PBKDF2、BCRYPT、SCRYPT等用来加密密码的Hash算法,称Password Hash。算法内,通常计算Cryptographic Hash很多次,减慢Hash计算速度,增大暴力破解成本
Password Hash有一条设计原则,计算过程能按要求变慢,不容易被硬件加速
用哪种Password Hash?
密码学家并无定论。算法都不完美,各有缺点
PBKDF2计算过程需内存少可被GPU/ASIC加速,BCRYPT不支持内存占用调整易被FPGA加速,SCRYPT不支持单独调整内存或计算时间占用且可能被ASIC加速并有被旁路攻击可能
2013年NIST(美国国家标准与技术研究院)邀请密码学举办密码hash算法大赛(Password Hashing Competition)
参赛算法可能面临的攻击手段:
- 加密算法破解(原值还原、哈希碰撞等,即应满足Cryptographic Hash的第2、3、4条特性);
- 查询表/彩虹表攻击;
- CPU优化攻击;
- GPU、FPGA、ASIC等专用硬件攻击;
- 旁路攻击;
2015年7月,Argon2算法赢得了竞赛。算法过新,没大厂例子
大公司怎么加密用户密码?
2016年,Dropbox发生部分用户密码数据泄露事件,CTO表示他们对自己加密密码的方式很有信心,请用户放心
官方技术博客《How Dropbox securely stores your passwords》
先对密码sha512转化为64字节,然后对sha512结果用Bcrypt(每用户独立盐、强度10),最后用AES和全局唯一密钥将Bcrypt计算结果加密保存
三层加密原因:
- sha512将密码归一64字节hash值。一是Bcrypt对输入敏感,密码较长,计算过慢影响响应时间;另一个有些Bcrypt实现会将长输入直接截断为72字节,信息论角度讲,导致信息熵变小
- 选Bcrypt原因,Dropbox工程师对这算法更熟悉调优更有经验,参数选择标准,Dropbox线上API服务器可以在100ms左右的时间可计算出结果
- 最后AES加密。Bcrypt不是完美的算法,用AES和全局密钥进一步降低密码被破解的风险,为防密钥泄露,用了专用密钥保存硬件。最后使用AES加密的另一个好处,密钥可定时更换,降低用户信息/密钥泄露带来的风险