6

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

有什么方法可以将哈希值转换为具有正确信息的明文值(以及您需要什么信息)?

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

4

8 回答 8

32

如果您只存储密码的哈希值,那么不会。...无论如何,您应该只存储他们密码的正确加盐哈希。

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

于 2009-06-18T16:09:53.053 回答
10

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

如果您的密码安全地存储在一个良好的散列系统中,提供商将永远无法通过电子邮件将您的密码发送给您,如果您忘记了密码,您必须重置密码。

于 2009-06-18T16:09:03.880 回答
7

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

于 2009-06-18T16:08:43.083 回答
3

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

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

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

于 2009-06-18T16:11:02.790 回答
3

如果有一种简单的方法可以恢复明文密码,那么一开始就对密码进行散列是没有意义的。那时你还不如只使用 base64 或 ROT13 它们。(不要那样做!)

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

如果两个站点的哈希值相同,则用户很可能在两个站点都具有相同的密码。然而,不能 100% 保证,可能会发生哈希冲突,但这是极不可能的。

于 2009-06-18T16:12:45.863 回答
2

没有办法反转常用的哈希值。它们可以被暴力破解(尝试每一个可能的密码),或者您可以结合使用单词列表(使用常用密码列表)来暴力破解以加快速度,但这仍然是一个非常缓慢且 CPU 密集型的过程。

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

于 2009-06-18T17:25:21.150 回答
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”的密码

于 2010-07-05T23:34:37.217 回答
-1

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

于 2009-06-18T16:20:11.870 回答