关于在PHP/MySQL中使用盐加密密码的问题,参见我的之前的问题,我还有一个关于盐的问题。
当有人说“使用随机盐”来预/附加到密码时,这是指:
- 创建一个静态的、一次性的随机生成字符串,或者
- 创建一个每次创建密码都会随机更改的字符字符串?
如果盐对于每个用户都是随机的,并且存储在散列密码中,那么如何检索原始盐以进行验证?
hash(salt + password)
,以及每个用户的salt
。您可以将它们存储在单独的列中,或者全部存储在一列中(用某些哈希中未使用的字符分隔,例如;
)。只要能够检索到两者,就没问题。hash(hash(salt + secret) + password)
等方法。new_hash = salt + password + previous_hash
100,000次。如果速度太快,你可能需要将迭代次数调整为更高的值。如果想要稍后更改该值,请确保将迭代次数与用户记录一起存储,以便不影响以前存储的任何密码。$<algorithm>$<iterations>$<salt>$<hash>
"(或者如果你愿意,可以作为单独的字段)。hash(hash(salt + secret) + password)
,但同样也可以使用hash(hash(salt) + hash(secret) + hash(password))
。您使用的方法不会改变密码存储的有效性,其中一个并不比另一个更安全。依靠如何将密码和盐哈希在一起的设计来提供安全性被称为security through obscurity,应该避免使用。$salt.':'.$hash.':'.$hashFunc
以获取 abc:def:sha1
。这样,如果以后您决定更改为更长的盐或更改哈希函数,您可以检测到遗留密码并在运行时“升级它们”... - ircmaxell为了能够进行验证,盐必须与哈希值一起存储。最佳实践是每次创建或更改密码时使用不同的盐。