【发布时间】:2010-09-21 14:09:39
【问题描述】:
我以散列形式存储我的所有密码。我需要找回这些密码 例如
我的密码是“123456”,我将其保存为散列值“3453474852dfdsfdsfdf”。
我需要从哈希值中检索原始密码。 (获取密码)。
我该怎么做?我正在做 SHA1 哈希算法。
【问题讨论】:
我以散列形式存储我的所有密码。我需要找回这些密码 例如
我的密码是“123456”,我将其保存为散列值“3453474852dfdsfdsfdf”。
我需要从哈希值中检索原始密码。 (获取密码)。
我该怎么做?我正在做 SHA1 哈希算法。
【问题讨论】:
这是不可能的。 SHA1 非常小心谨慎地是 one-way function。
您为什么要尝试恢复原始密码?身份验证不需要它,因为您只需对输入密码进行哈希处理并比较哈希值。
如果是因为用户忘记了密码,那么标准做法似乎是生成一个随机重置链接并将其通过电子邮件发送给用户。
【讨论】:
关于该主题的两篇有趣的文章:You're Probably Storing Passwords Incorrectly 和 Rainbow Hash Cracking...
所以这取决于您打算做什么(密码存储保险箱或为网站上的用户存储密码等)。对于前一种用法,你可以看看KeePass是如何工作的(它是开源的)。
【讨论】:
你不能那样做,这就是哈希函数的意义所在。事实上,多个密码可以为您提供相同的哈希值,因此即使您找到一个字符串为您提供该哈希值,它也可能不是正确的。
如果您需要找回密码,请不要使用散列,使用 RSA 之类的东西。
一些链接供您阅读:
【讨论】:
你不能。 hash function(相对于encryption)的意义在于它是一个单向过程。换句话说,可以有多个密码哈希到相同的值,并且没有办法从哈希到原始密码。
这很有用,因为您不需要任何类型的“主密码”或双向加密所需的其他机密 - 但这确实意味着您永远无法从散列值中取回原始密码.如果您确实需要密码,则必须使用加密/解密而不是散列。
【讨论】:
你不能,这就是哈希的用途。因此,许多网站都可以选择重置密码(即将您提供的新密码的哈希值放入数据库中)。 您通常找不到检索当前密码的选项(即通过邮件发送给您)。
如果网站确实提供此功能,则表示它们不存储密码哈希,而是存储明文或加密密码。由于存储哈希是最佳做法,因此您应该避开提供密码检索的站点。
而且你应该避免自己开发这样的网站;-)
【讨论】:
如果您没有使用salt,那么您可以使用dictionary attack 破解密码。
编辑:我知道他最初的问题是如何检索他存储的密码,但我很高兴为问题标题所暗示的更通用的问题提供解决方案。
【讨论】:
这里没有粗鲁的意思,但你真的明白你为什么要对密码进行哈希处理吗?
【讨论】:
理论上你不能像其他 cmets 提到的那样。
我认为 Rick 想说的是,如果攻击者知道您使用 SHA1 算法进行散列和您使用的盐,他们可以将散列映射到密码以尝试检索密码。
但要回答你的问题:不,你不能轻易做到这一点。
【讨论】: