我知道bcrypt比其他方法更安全,但仍然会让你遇到需要盐密码的情况! 如果salt包含在哈希字符串中,则不需要将其单独存储在数据库中。每次我需要创建一个新的哈希,也就是新盐,我是否必须获取所有密码,提取盐并检查新的哈希值是否已存在于我的数据库密码中? 是否更容易直接储存盐分以便于比较?如果是,那么我没有得到:
答案 0 :(得分:4)
我实际上不同意Curtis Mattoon对几件事的回答。
使用bcrypt进行哈希处理时,salt直接存储在哈希中,因此您无需单独存储它。我不确定他的意思是什么,因为没有盐的哈希是完全没用的。需要使用salt来根据哈希验证密码。
我同意这一点。如果要更新一个密码,则无需全部更新。事实上,这是不可能的,因为你(希望)不知道任何其他用户的密码。
你不需要经历痛苦就能得到一种独特的盐。如果是这种情况,您可以使用uniqid
,但问题是它的输出是可预测的。可预测性在密码学中是一件坏事。相反,你想要做的是使用尽可能接近随机的伪随机盐(即使用/dev/random
而不是/dev/urandom
)。如果您有十亿用户,您可能会得到一两个具有完全相同的盐,但严重的是,这是一个如此大的问题吗?所有这一切都使得某人有机会强制将这两个特定密码的密码强加给十亿,我怀疑它甚至可能发生碰撞。不要因此而疲劳。使盐是随机的,而不是唯一的。使用诸如上次登录时间或IP地址之类的东西只会带来随机性。
至于SHA512与Blowfish之间的比较,请参阅此处SHA512 vs. Blowfish and Bcrypt
答案 1 :(得分:3)
这个网站似乎在一个简短的解释上做得不错:http://michaelwright.me/php-password-storage
快速回答:
1)您不需要存储盐。
2)如果为每个密码使用唯一的盐,则无需更新所有哈希值。
3)我不是加密专家,但是当你为每个用户/密码使用一个独特的盐时,攻击者必须为每个用户使用一组不同的彩虹表。在整个站点中使用相同的salt值意味着每个用户的密码都会受到相同哈希表的影响。在过去(无论好坏),我使用了用户上次登录时间和/或最后一次IP作为密码盐的功能。
e.g。 (伪代码)$ password = hash(hash($ _ POST ['password'])。hash($ row ['last_login']));
4)我会推迟“为什么bcrypt更好?”向更了解这类事情的人提问。这个答案可能会有所帮助:How do you use bcrypt for hashing passwords in PHP?