PHP / SQL:Un-md5一个字符串

时间:2012-03-17 19:34:35

标签: php mysql md5

  

可能重复:
  Is it possible to decrypt md5 hashes?

我有一个用于存储用户名,密码,电子邮件等的数据库。如果用户忘记了他/她的密码,我会将其发送到他们的电子邮件帐户。

问题是我在将密码存储到数据库之前将密码加密为md5。如果用户的密码是ABC,我将其作为867dbd57e9ca9f808存储在我的数据库中。如果用户忘记了密码,我就无法发送用户“867dbd57e9ca9f808”。我需要发送“ABC”。但是,这需要我“un-md5”字符串,我认为这是不可能的。

5 个答案:

答案 0 :(得分:10)

MD5被设计为哈希,这只是一种方式,否则它不会是哈希。您不应该向用户发送密码,但可以更改密码。您应该生成一个令牌,发送链接以使用GET参数中的令牌将密码更改为用户的邮件。如果用户更改密码,请删除令牌。此外,您应该记住,令牌必须有到期时间。

类似的东西:

myurl.com/passwordrecovery?token=someGeneratedToken

在数据库中,您可以查找令牌并获取用户ID。例如,您的表结构可能如下所示:

user_id | token | expiry_time

如果您在数据库中保留令牌和到期时间,请勿执行此操作将令牌与用户关联,否则用户可以请求更改密码,他将获得以下链接(不要这样做):

myurl.com/passwordrecovery?token=token&user_id=number

这样他就可以通过替换user_id来更改别人的密码。并访问他的帐户。到期时间不应超过24小时。

重要

不要使用普通的md5,它很容易破解。例如,使用pbkdf2

PHP实现: PHP-Crypt-LibPbkdf2 by inanimatt

答案 1 :(得分:2)

MD5不是加密,而是哈希。这意味着 - 它是不可逆转的。您无法从哈希中获取原始字符串。

至于你的情况:就像今天大多数网站一样。他们不会向您发送密码,而是会向您发送一个链接,您可以使用该链接重置密码。这样您就不必存储纯文本密码并通过电子邮件发送。

答案 2 :(得分:2)

MD5 不是加密算法

这是一个哈希算法。它产生的不是加密形式的输入;它是哈希

哈希是一种单向转换。在数学中,有一个我们称之为“鸽子孔原理”的概念。如果你有十只鸟,九只幼崽要保留它们,那么必须有一些幼崽,里面有一只以上的鸟。同样,如果您的密码长度为50,并且所有哈希值都是20,那么必须有多个具有相同哈希值的密码 - 鸽子的数量远多于空洞!

由于有很多(实际上是无数的)密码具有相同的散列,即使是暴力猜测方法也无法从散列中恢复原始密码(尽管它可能能够找到 some < / em>密码有一定的哈希值,但不确定它是用户给出的那个。原始信息已丢失

但是,您永远不需要向用户发送密码。 请勿通过电子邮件发送密码。一个例外是当用户需要重置密码时;在这种情况下,为他们生成一个新的临时密码/令牌,然后给他们。然后强制他们在登录时立即设置新密码。理想情况下,您可以使用安全通信工具(例如与您的站点建立SSL连接),而不是使用不安全的电子邮件。

您不应该关心用户的密码是什么,只知道他们知道密码。

答案 3 :(得分:1)

散列字符串的整个要点是要让实际的密码回来很难。

顺便说一下,为了提高数据库的安全性,你应该“加密”密码哈希,因为只需MD5哈希密码文本就可以让有哈希的人轻松使用彩虹表获取密码。

如果用户忘记了密码,请向他们发送一个链接,允许他们创建新密码。永远不要通过电子邮件发送密码,这是非常不安全的。

答案 4 :(得分:1)

以下是MD5的功能示例:

假设您想要“md5”一词“bar”

现在假设md5接受字符串的每个字母,为每个字母分配一个值并将所有数字相加。

b分配给2(字母表的第二个字母......)
a分配给1
r分配给18

总和是21。

你无法获得反转值,因为我的虚拟md5功能,“arb”,“rab”,“ggg”也给21。

这就是md5是单向函数的原因。