这些天来,每个人都在抨击 MD5 在存储密码方面的问题。但是,如果我只想为可能会使用一次的东西添加一层身份验证,那又如何呢?
这只是一个假设的例子,但假设我有一个允许用户重置密码的功能。我通过电子邮件向用户发送一个链接,他们可以单击该链接来设置新的(随机生成的)密码。
我目前的想法是,我将使用私有盐值和几个标识变量生成一个 MD5 哈希,并使用它来创建链接。
假设此功能的盐是“8b769a378411b705”(我对所有重置密码请求使用相同的盐)。其他识别数据是已经生成的密码散列的用户 ID 和数据库 ID。
salt = "8b769a378411b705" (private)
user_id = 123
pw_id = 456
code = md5(salt + " " + user_id + " " + pw_id)
变成
code = "692a71cd7da194145be209e40fcd3e92"
示例链接:confirm_reset_password.php?user_id=123&pw_id=456&code=692a71cd7da194145be209e40fcd3e92
鉴于 MD5 的问题,这被认为是安全的吗?我应该考虑使用另一种单向哈希,例如 SHA-1?
我一直在使用带有 SHA1 的 PBKDF2 来存储密码,我知道它的部分好处在于它的“慢”以及生成哈希需要多长时间。我可以为这样的目的生成那些更高质量的哈希,但我认为它会适得其反,因为你可以通过用(不正确的)请求轰炸服务器来轻松地让服务器瘫痪,因为每个请求都会导致大量的 CPU 工作产生哈希(特别是因为我使用了很多迭代)。似乎拥有“快速”算法对于单次使用目的是有好处的,但我想知道 MD5 是否仍然是最佳选择。
谢谢!