用所使用的算法为我的哈希添加前缀是不好的做法吗?

信息安全 密码 哈希
2021-08-15 11:49:33

假设我有一个数据库,里面有一堆用户。该用户数据库通常会为每个用户提供一个散列密码。用所使用的散列算法为这个散列添加前缀是不好的做法吗?

例如aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d,我使用 store代替 hash ,sha1_aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d因为生成散列的方法是 SHA1。

我注意到 Argon2 这样做了,我实际上认为它非常方便,因为随着时间的推移,它可以更容易地为新用户部分迁移到更新的哈希算法。

我不在生产代码中使用 SHA1 作为密码。SHA1 是随机选择的。这个问题与散列方法的使用无关。

4个回答

许多不同的密码散列系统都这样做。使用的散列机制类型不应该(也不应该是)秘密。Kerckhoffs 原理说:

一个密码系统应该是安全的,即使系统的所有内容,除了密钥,都是公共知识。

因此,如果您的系统是适当安全的,那么散列机制是否暴露就无关紧要了。

我同意施罗德的观点,这样做是可以的。即使没有前缀,攻击者也可能找出您使用的算法。无论如何,保护密码的是散列算法的强度,而不是算法的保密性。

请注意,许多散列算法和库已经为您执行此操作。他们将所有相关信息——算法、成本因素、盐、实际哈希值——嵌入到一个序列化字符串中。参见例如Modular Crypt Format或 PHP password_hash函数。所以不要去制定自己的计划。如果您使用的是下降散列库,那么您已经有了一个。

但是,不要使用 SHA1 来散列密码。那不行。

不,这不是坏习惯,可以说,你应该保留这些信息。

正如您所观察到的,这使您可以随时更改新密码的算法,而不会使所有用户的现有密码无效(由于某种原因,这样做会使您不受欢迎)。

有一种说法是,这允许攻击者搜索出较旧的、较弱的密码以首先进行攻击,但您根本没有降低它们的安全性(假设 Kerckhoff 原则,算法本身不必是秘密)。

存储散列算法是一种很好的做法,但适当的密码散列函数(如 Argon2 和 PBKDF2)已经处理了这一点。然而,单独使用 SHA1 或 SHA256 进行密码散列是不好的做法,因为它们是使用字典攻击和蛮力破解的固定(并且相对较小)的工作量。这些密码应该通过在下次登录时重新散列密码来迁移到安全散列函数。有关详细信息,请参阅https://crypto.stackexchange.com/a/45405