参考文章:Salted Password Hashing - Doing it Right

安全的姿势

存储密码:

  1. 产生一个随机的盐,用CSPRNG算法(Cryptographically Secure Pseudo-Random Number Generator)。
  2. 将盐加到密码的头部,然后用标准哈希函数去加密,如Argon2, bcrypt, scrypt, PBKDF2。
  3. 将hash值和盐一起存到数据库中。

验证密码:

  1. 从数据库中将hash值和盐取出。
  2. 将盐放到输入密码的头部,并用相同的哈希函数去加密。
  3. 比较两个hash值是否相同,如果相同说明输入密码正确。

slow funciton

加盐虽然能够抵御rainbow table的攻击,但是无法抵挡字典或者暴力的方法。 我们可以通过使用slow hash function来使得计算hash的时间变长,这样就可以大大延长暴力破解的时间。

但要注意不能太久,反而影响了正常用户的登录。slow hash会使得dos攻击更容易,但是可以通过加验证码来解决。 也可以放到前端做slow funciton(前提要浏览器支持javaScript),然后后端再hash一遍。

在 Web 应用中,一定要在后端hash

如果为了提高性能,把hash的工作放到了前端,那么一旦数据库泄露,攻击者便可以利用数据库中存储的hash值直接登录用户账号。

错误的姿势

根据Kerckhoffs's principle,我们应该假设攻击者已经获得我们的源代码。

奇怪的哈希函数(组合)

最好不要自己发明一些哈希函数,而是去用已经经过严格数学证明并广泛被使用的哈希函数。

盐的重复使用,盐的长度太短,使用一些可预测的盐

盐的重复使用是指:硬编码在代码中的盐,或者只随机生成一次的盐。这样的话如果两个用户的密码相同,他们的hash值还是相同的。

盐的长度太短容易被暴力破解。比较安全的做法是采用和哈希函数的输出一样的长度。

可预测的盐指:用户名,日期之类的。

最后修改:2020 年 07 月 30 日 09 : 58 PM