当密码存储为哈希值时检索密码

时间:2009-06-18 16:04:39

标签: asp.net hash passwords dotnetnuke

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

有没有办法将哈希值转换为带有正确信息的明文值(以及您需要哪些信息)?

如果用户在两个站点上存储了相同的密码哈希值,那么两个站点的密码是否相同?

8 个答案:

答案 0 :(得分:29)

如果你只存储密码的哈希值,那么没有。 ......无论如何,你应该只存储密码正确的哈希值。

密码重置机制是正确的选择。

答案 1 :(得分:10)

一般无法检索散列密码(这取决于散列函数,无法检索安全散列)。如果它们在两个站点上具有相同的哈希值,则它们可以具有相同的密码,这取决于站点使用的哈希盐,什么方法等。

如果您的密码安全地存储在良好的哈希系统中,则提供商永远不能通过电子邮件向您发送密码,如果忘记密码,则必须重置密码。

答案 2 :(得分:7)

简而言之,没有。使用大多数散列算法,您可以使用相同的输出具有多个输入。提供密码重置选项通常更好。

答案 3 :(得分:3)

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

根据定义,哈希是单向函数。它无法逆转。

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

答案 4 :(得分:3)

如果有一种简单的方法来恢复明文密码,那么开始使用密码就没有意义了。那时你可能只是base64或ROT13。 (不要那样做!)

正如其他人提到的,使用其他密码恢复方法。确实没有充分的理由可以访问明文密码。

如果两个站点的哈希值相同,则用户很可能在两个站点上都使用相同的密码。然而,不是100%保证,可能存在哈希冲突,但这是非常不可能的。

答案 5 :(得分:2)

没有办法扭转常用的哈希值。它们可以是强制的(尝试每一个可能的密码),或者你可以结合使用单词列表(使用常用密码列表)来强制加速它,但它仍然是一个非常缓慢且CPU密集的过程。 / p>

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

答案 6 :(得分: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”的密码

答案 7 :(得分:-1)

存储密码哈希的一般思想是确保密码是安全的......即使是那些有权访问数据库的人也是如此。信任从不隐含。哈希是一种单向算法,因此无法从哈希码中派生原始密码。通常,当用户需要恢复存储为哈希的密码时,您应该向他们询问他们的秘密问题,并将他们的临时密码通过电子邮件发送给他们,或者通过电子邮件向他们发送可以更改密码的临时链接。这样可以确保密码永远不会以明文形式存储,并且对所有窥探者都是安全的,即使是那些可能被认为值得信赖的人。