用户密码加密存储

ddatsh

dev #dev

看似简单?

DB权限管理十分严格,敏感信息开发工程师都看不到,密码明文存储行不行?

不行

数据面临很多威胁,程序、数据库、OS、机房、员工,百分百不被窃取非常困难

密码加密存储,即便被拖库,也难以获取明文密码。密码加密存储是底裤,重要性相当于独自出远门时缝在内衣里钱,虽然用到的概率不大,但关键时刻他们能救命

用加密算法如AES把密码加密再存,需要明文的时候再解密就安全?

怎么安全保存用来加密解密的密钥?

虽业界有成熟的、软硬件密钥存储方案。但密码值一样,想要密钥百分百不泄露也不可能

但密钥一泄露,明文密码也就泄露

把加密密码变成存密码的HASH值,MD5就可以?

不是所有的HASH算法都可以,应该用Cryptographic Hash

  1. 任意大小输入,计算hash非常快
  2. 单向hash
  3. 输入很小改动,hash很大变化
  4. 无碰撞

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)

参赛算法可能面临的攻击手段:

2015年7月,Argon2算法赢得了竞赛。算法过新,没大厂例子

大公司怎么加密用户密码?

2016年,Dropbox发生部分用户密码数据泄露事件,CTO表示他们对自己加密密码的方式很有信心,请用户放心

官方技术博客《How Dropbox securely stores your passwords》

先对密码sha512转化为64字节,然后对sha512结果用Bcrypt(每用户独立盐、强度10),最后用AES和全局唯一密钥将Bcrypt计算结果加密保存

三层加密原因: