将密码以哈希值存储时如何找回密码

7

如果密码以哈希值存储,用户能否要求将密码通过电子邮件发送给自己?

有没有办法将哈希值转换为明文密码,需要哪些正确的信息来完成此操作?

如果一个用户在两个网站上存储相同的密码哈希值,这两个网站上的密码是否相同?

8个回答

34
如果您只存储了密码的哈希值,那么不行。... 而且您应该只存储适当进行盐处理的密码哈希值。
密码重置机制是正确的替代方案。

1
请查看我的答案以正确使用盐...存储盐会使使用它的目的失去意义... - jrista
12
盐的作用是为了打败查找表攻击,这样就不可能仅通过对大量可能的密码进行哈希并查找它们的哈希值。这并不依赖于保密盐。此外,如果您不存储它,那么您如何检查密码呢? - David Thornley

10

通常情况下,散列(Hash)密码是无法被检索出来的(这取决于散列函数,安全的散列算法是无法被检索出来的)。如果在两个网站上使用的散列相同,则可能意味着用户使用了相同的密码,这取决于网站使用的散列盐、加密方法等。

如果您的密码存储在一个良好的散列系统中,提供商不应该能够通过电子邮件向您发送密码,如果忘记密码,必须重置密码。


7

简而言之,不行。大多数哈希算法都可以有多个输入产生相同的输出。提供密码重置选项通常更好。


4
如果有一种简单的方法可以恢复明文密码,那么开始哈希密码就没有任何意义。这时候你可能会考虑使用base64或ROT13进行加密(不要这样做!)。正如其他人所提到的,应该使用其他密码恢复方法。实际上,没有一个好的理由需要访问明文密码。如果两个站点的哈希值相同,用户很可能在两个站点上使用相同的密码。但是并不能百分之百的保证,因为哈希碰撞的概率非常小。

2
更有可能意味着两个网站都没有添加盐。 - Ian Boyd

3

有不同类型的哈希算法。其中一些比其他算法更安全。MD5是一种流行但不安全的算法。SHA系列是另一组更安全的算法。

根据定义,哈希是一种单向函数。它无法被反转。

http://en.wikipedia.org/wiki/Sha-1


纯SHA-1/2是一个不好的选择。你需要一些盐,并且需要一些东西来减缓哈希速度。PBKDF2、bcrypt、scrypt是标准选择。 - CodesInChaos
同意,我现在通常只使用bcrypt,但无论如何,问题实际上是关于反转哈希,这是不可能的。(使用已知哈希的查找表与反转哈希并不相同。) - Bryan Migliorisi

2

常用哈希算法无法被逆转。可以使用暴力破解(尝试每个可能的密码)或者使用密码列表(使用常用密码列表)结合暴力破解来加速,但这仍然是一个非常缓慢和需要大量CPU的过程。

许多网站采用的最佳方式是创建一个“密码重置”按钮,在其中输入用户名和电子邮件地址,如果匹配,则发送一个随机密码并给您提供一个登录页面的链接,您可以使用随机密码登录并更改密码。


0

要做到这一点,您必须具有带有字段的模型:

Hashed_password
Salt

你需要知道用户使用的哈希密码方法(这里我使用SHA1) 然后你可以在控制器中定义:

def self.encrypted_password(password, salt)
   string_to_hash = password + "wibble" + salt
   Digest::SHA1.hexdigest(string_to_hash)
end

接下来你可以进行比较:

user.Hashed_password == encrypted_password(password, user.salt)

True表示"password"是用户"user"的密码


-1
存储密码哈希的一般想法是确保密码安全,即使是那些可以访问数据库的人也无法获得。信任从来都不是默认的。哈希是一种单向算法,因此无法从哈希码中推导出原始密码。通常,当用户需要恢复存储为哈希的密码时,您应该询问他们的密保问题,并通过电子邮件发送临时密码或电子邮件发送临时链接,以便他们可以更改密码。这确保密码永远不会以明文形式存储,并且对于所有窥探的眼睛都是安全的,即使是那些可能被认为是值得信赖的人。

6
“而且存储盐,不会破坏一开始设置盐的目的。”这是错误的。你必须存储盐,如果不存储,将无法验证哈希值。存储盐没有安全隐患 - 盐只存在于防范查找攻击中。 - frankodwyer
2
我不同意你的评论,即盐应立即丢弃。在密码交换的例子中,是的,盐是一次性的,应该被丢弃。但在用户身份验证中,应使用每个用户的盐,并必须与密码一起存储以使其可用。例如,使用用户名加盐密码可以防止预先计算的字典攻击,因为每个用户都需要一个字典。 - longneck
在实际操作中,大多数程序员不会将盐值存储在数据库中,因为如果有人获得了数据库并拥有哈希值,他们也会拥有盐值。盐通常存在于应用程序代码中。另一个想法是使用计算的盐,例如基于用户加入时间进行加盐。 - marr75
2
如果可以独立计算盐值,那应该是可行的,前提当然是它能够可靠且快速地再生。将它们嵌入应用程序代码中意味着入侵者只需要一个彩虹表就可以攻破整个站点。将它们放在数据库中意味着可以快速检查,并有效地防止使用查找表。 - David Thornley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接