使用真正的随机盐或用户名盐加胡椒进行密码哈希?

Jas*_*des 5 security passwords hash salt

考虑以下两种方法:

hashedPassword = hash(trulyRandomSalt + password)
Run Code Online (Sandbox Code Playgroud)

其中 hashedPassword 和 trueRandomSalt 存储在数据库中。

hashedPassword = hash(applicationConstantPepper + uniqueUserName + password)
Run Code Online (Sandbox Code Playgroud)

其中 hashedPassword 和 uniqueUserName 存储在数据库中,applicationConstantPepper 存储在应用程序配置中。在这里,uniqueUserName 充当盐,通常是电子邮件地址。

我已经读过这个问题,它有很多重要的信息,但没有解决应用程序恒定胡椒值以及如何使用用户名作为盐来改进。

我一直使用方法一和 32 位加密随机盐。但是,我刚刚看到另一个应用程序中使用了方法二。我对方法二遇到的第一个问题是它将用户名与哈希值联系起来,这样用户名就永远不会在不重新生成哈希值的情况下更改。

方法二有哪些安全问题?哪种方法是最好的使用方法?

Ant*_*rds 1

考虑以下两种方法:

第一种方法很糟糕,因为它允许获取您的哈希值的攻击者使用像oclHashcat这样的东西,通常每月进行数万亿或千万亿次猜测,而第二种方法则很可怕,因为这些相同的攻击者不仅可以进行相同的(通常是数万亿次)猜测或每月数万亿次猜测,如果他们在获取您的密码之前获取了应用程序ConstantPepper 和用户名,那么他们可以在获取您的密码时预先计算猜测。

请阅读如何安全地散列密码?,其中 Thomas Pornin 指出“为了让胡椒真正适用,您需要处于特殊的设置中,其中不仅仅是带有磁盘的 PC;您还需要 HSM。” 请阅读整篇文章以了解上下文,但其要点是:

  • 请使用 PBKDF2(也称为 RFC2898 和 PKCS#5v2)、BCrypt 或 SCrypt。
  • 无论您的调味料有多好,都不要使用单次哈希算法。
  • 请使用 8-16 字节加密随机盐。
  • 使用尽可能高的迭代计数/工作因子,因为您的机器可以在峰值负载下处理,而不会引起用户抱怨。
  • 特别是对于 PBKDF2,请勿请求或使用比哈希函数的本机大小更多的输出字节。
    • SHA-1 20 字节
    • SHA-224 28 字节
    • SHA-256 32 字节
    • SHA-384 48 字节
    • SHA-512 64 字节
  • 如果您使用的是 64 位系统,请考虑使用 PBKDF2-HMAC-SHA-384 或 PBKDF2-HMAC-SHA-512,这将减少使用 2014 年老式 GPU 的攻击者对您的优势。

如果您无论如何喜欢胡椒概念,请阅读密码哈希添加盐+胡椒或盐足够了吗?再次,特别是托马斯·波林的回答。