在将密码存储到数据库之前将盐添加到密码中

adding salt into password before storing it into database

通过使用 salt,我知道密码会在存储到数据库之前添加随机生成的 salt。 但是,我不太确定每个密码的盐是唯一的,还是所有密码只混合了相同的“随机生成”盐

例如, 在我的应用程序下,有两个用户和两个密码:user1password1 和 user2password2 他们的密码肯定会与盐混合。但是,在存储到数据库之前,结果是 user1password1 + 盐,user2password2 + 盐 要么 user1password1 + salt1 , user2password2 + salt2

理想情况下,您的盐应该每个用户或每个密码是唯一的。

现在,正如您在将密码存储在数据库中之前所说的那样,you should hash them with a password-based KDF such as Argon2. (Not with a hash function。)

使用单一盐

有一个一个主要问题如果您对所有密码使用相同的盐:它会降低攻击您的数据库的成本,因为对手 Eve 可以采取“通用密码”字典让我们称之为“rockyou.txt”,这足以让她尝试散列 rockyou.txt 中包含的所有密码,一旦使用该盐尝试破解一些密码您的用户密码。

基本上这意味着在您的数据库中查找多个哈希的原像的工作因素很低。

使用不同的随机盐

而对每个用户(甚至是密码数据库中的每个条目)使用不同的盐意味着 Eve 必须重新进行计算,她试图对 rockyou.txt 字典中的所有单词进行哈希处理以得到尝试在您的数据库中找到单个哈希的原像。

所以在这里,工作因数很大,因为必须为每个密码哈希重新计算它。

因此,如果您可以为每个密码存储一个大的(理想情况下为 128 位或更多位,但 64 位也可以 - 存储是一个问题)随机盐,请这样做并确保您永远不会存储明文密码,但只有它们的哈希值。