【发布时间】:2010-08-17 17:48:36
【问题描述】:
我正在处理这个 PHP 项目,我有很多地方正在使用 md5。我什至用过很多次,但今天我仍然不清楚这个功能在做什么。我意识到它会解密传入的值,但是如何撤消它以将其恢复为原始值。也许我不清楚整个过程,如果有人有关于这个过程的信息,我将不胜感激
【问题讨论】:
我正在处理这个 PHP 项目,我有很多地方正在使用 md5。我什至用过很多次,但今天我仍然不清楚这个功能在做什么。我意识到它会解密传入的值,但是如何撤消它以将其恢复为原始值。也许我不清楚整个过程,如果有人有关于这个过程的信息,我将不胜感激
【问题讨论】:
md5 是一个散列函数
散列函数是任何定义良好的 程序或数学函数 转换一个大的,可能 可变大小的数据量 小基准。 a 返回的值 哈希函数称为哈希值, 哈希码、哈希和、校验和或 只是散列。
【讨论】:
MD5 is a one way encryption hash。
它不会解密任何东西,而是为您创建一个哈希码,您可以使用它与其他 MD5 哈希值进行比较。过去,如果两个哈希匹配,您可以确信这两个输入是相同的。最终发现了几次碰撞,然后是故意制造碰撞的方法(出于安全目的降低 MD5 的值)。这是一个相当快的算法,所以它仍然有一些用处(在大量数据传输期间检查损坏,以及您所在的其他地方可能会提供其他形式的保护以防止真正的攻击)。
【讨论】:
MD5 本身不是一种加密,而是一种生成校验和的算法。无论你传入什么数据,你都会得到一个固定长度的十六进制(只有 0-9 和 A-F)字符串。这个想法是,除了您传入的数据之外,任何其他数据都不太可能产生相同的 MD5 字符串。由于结果具有固定长度,而您的数据可以是任意长度,显然 其他数据会产生相同的 MD5 字符串,但同样,您不太可能找到它。
因此,没有办法真正“解密”一个 MD5 字符串。你所做的是,你从一些数据生成它,然后从一些其他数据生成它,并比较两个 MD5 字符串。如果它们相同,则可以非常确定(尽管不是 100%)这两个输入数据是相同的。
【讨论】:
MD5 不解密任何东西。它被认为是一种单向散列算法。对于给定的输入,它返回一个固定长度的字符串。此外,对于两个非常相似但不相同的给定输入,返回的 md5 值将不可预测。
散列适用于很多事情,例如文件验证。虽然题外话,但如果您获取一个文件并为其计算一个哈希值,然后将一个文件连同一个哈希值一起发送给某人,他们可以通过自己对其进行哈希处理然后断言他们的哈希值与提供的哈希值匹配来轻松验证他们收到的文件是否正确。
另一个例子是网站上的身份验证。在对用户进行身份验证后,您开始一个会话,并在该会话中存储 md5(username+time) 并在用户浏览器 md5(username+time) 上存储一个 cookie,然后在后续页面请求中,您可以检查会话哈希是否匹配cookie 哈希来断言用户是他们所说的人。 Md5 不是这种类型的好散列,但散列通常可以在诸如此类的情况下提供帮助。对于这个应用程序甚至 sha512,sha1 将是一个更好的散列函数。
【讨论】:
$_SESSION 来代替家庭种植的。这反过来也已经由具有强 ID 的 cookie 支持。
$_SESSION 中。会话 客户端匹配已由 PHP 处理。它已经在后台使用 cookie(PHPSESSID 之一)。
MD5 是一种加密散列函数。加密散列函数具有基于输入生成结果的特殊属性,但几乎不可能恢复原始输入。这有点像“单向加密”。此外,通过加密哈希函数传递相同的数据,您应该始终得到相同的结果。
虽然它们不是加密的首选,因为它只是一种方式,但它们在存储密码时非常有用。这是因为,正如我所说,相同的输入总是有相同的结果。这使得以纯文本形式存储密码,甚至是可恢复的版本(例如加密密码)变得不必要。相反,您只需从密码生成哈希并将其存储在数据库中。每当有人尝试登录时,您都会从数据库中检索哈希值,然后根据用户输入的密码生成新的哈希值并比较两者。
请注意,MD5 不是很安全,您应该尝试使用其他更安全的哈希函数,例如 SHA512:
<?php
$hash = hash('sha512', $data);
?>
有用的链接:
【讨论】:
见http://en.wikipedia.org/wiki/Hash_function。
哈希函数的强度取决于它的逆向难度。
【讨论】:
【讨论】: