PHP的md5函数解释

6

我正在开发一个PHP项目,有很多地方都使用了md5。虽然我已经使用过很多次,但今天我仍然不清楚这个函数在做什么。我知道它可以解密传递的值,但是如何将其还原为原始值呢?也许我对整个过程不是很清楚,如果有人了解这个过程,我将非常感激。


7个回答

7

MD5是一种哈希函数。

它只能单向运作。

哈希函数是指将大量、可能大小不同的数据转换为小数据的任何明确定义的过程或数学函数。哈希函数返回的值称为哈希值、哈希码、哈希和、校验和或简称哈希。


4

MD5是一种单向加密哈希

它不能解密任何东西,而是创建一个哈希代码,您可以将其与其他MD5哈希进行比较。曾经有两个哈希匹配时,您可以确信两个输入是相同的。但随后发现了几个碰撞,以及有意创建碰撞的方法(为了安全目的而降低MD5的价值)。这是一种相当快速的算法,因此仍然可以在某些情况下使用它(检查大量数据传输期间的损坏,并在可能提供其他形式的保护以防真正攻击的其他地方)。


2

MD5不是加密算法,而是一种生成校验和的算法。无论您传入什么数据,都会得到一个固定长度的十六进制(仅包含0-9和A-F)字符串。其想法是除了您传入的数据之外,很难得到相同的MD5字符串。由于结果具有固定的长度,而您的数据可以是任意长度,因此显然会有其他数据得到相同的MD5字符串,但再次强调,您很难找到它。

因此,实际上没有办法“解密”MD5字符串。您所做的是从某些数据生成它,然后从其他数据生成它,并比较这两个MD5字符串。如果它们相同,您可以相当确定(虽然不是100%),两个输入数据是相同的。


1

MD5是一种加密哈希函数。加密哈希函数具有特殊属性,它们基于输入生成结果,但几乎不可能恢复原始输入。这有点像“单向加密”。此外,通过将相同的数据通过加密哈希函数传递,您应该始终获得相同的结果。

虽然它们不适用于加密,因为它只是单向的,但在存储密码时非常有用。这是因为,正如我所说,相同的输入总是会产生相同的结果。这使得存储明文密码或可恢复版本(例如加密密码)变得不必要。相反,您只需从密码生成哈希并将其存储在数据库中。每当有人尝试登录时,您将从数据库中检索哈希,然后从用户输入的密码生成新的哈希并比较两者。

请注意,MD5不太安全,您应该尝试使用其他更安全的哈希函数,例如SHA512:

<?php
$hash = hash('sha512', $data);
?>

有用的链接:


1

MD5不会解密任何东西。它被认为是一种单向哈希算法。对于给定的输入,它返回一个固定长度的字符串。此外,对于两个相似但不完全相同的输入,返回的md5值将是不可预测的。

哈希在很多方面都很有用,例如文件验证。虽然与主题无关,但如果您对文件进行哈希计算,然后发送一个文件和哈希给某人,他们可以通过自己进行哈希并断言其哈希与提供的哈希匹配来轻松验证他们是否正确接收了文件。

另一个例子是网站上的身份验证。在验证用户身份后,您启动一个会话,并在该会话中存储md5(用户名+时间),并在用户浏览器上存储md5(用户名+时间)的cookie,然后在随后的页面请求中,您可以检查会话哈希是否与cookie哈希匹配,以确定用户是否是他们所说的那个人。MD5不适合这种类型的哈希,但哈希通常可以在这些情况下有所帮助。sha1将是更好的哈希函数,甚至是sha512。


我宁愿使用$_SESSION来处理这个问题,而不是自己编写一个。这样做的好处是,$_SESSION已经通过一个带有强ID的cookie进行了支持。 - BalusC
@BalusC 我是说要使用会话,还是我误解了你的回复? - Chris
您不需要创建另一个cookie。只需将用户名存储在$_SESSION中即可。PHP已经处理了会话<-->客户端匹配。它已经在幕后使用了一个cookie(PHPSESSID)。 - BalusC

0

0

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