关于 Ray Paseur 的评论,字符串哈希为
0e462097431906509019562988736854
0e830400451993494058024219903391
获得完全匹配格式 /^0+e[0-9]+$/ 的哈希值的概率并不高,但也不容忽视。
应在所有哈希函数中添加一般警告,始终使用三等号 === 进行比较。
实际上,警告应该在比较字符串值时放在运算符部分! 关于字符串比较有很多警告,但没有关于格式 /^0+e[0-9]+$/ 的具体内容。
(PHP 4, PHP 5, PHP 7, PHP 8)
md5 — 计算字符串的 md5 哈希值
由于此哈希算法的速度很快,不建议使用此函数来保护密码。 有关详细信息和最佳实践,请参阅 密码哈希常见问题解答。
使用 » RSA Data Security, Inc. MD5 消息摘要算法 计算 string
的 MD5 哈希值,并返回该哈希值。
以 32 个字符的十六进制数字形式返回哈希值。
示例 #1 md5() 示例
<?php
$str = 'apple';
if (md5($str) === '1f3870be274f6c49b3e31a0c6728957f') {
echo "您想要绿苹果还是红苹果?";
}
?>
关于 Ray Paseur 的评论,字符串哈希为
0e462097431906509019562988736854
0e830400451993494058024219903391
获得完全匹配格式 /^0+e[0-9]+$/ 的哈希值的概率并不高,但也不容忽视。
应在所有哈希函数中添加一般警告,始终使用三等号 === 进行比较。
实际上,警告应该在比较字符串值时放在运算符部分! 关于字符串比较有很多警告,但没有关于格式 /^0+e[0-9]+$/ 的具体内容。
md5('240610708') == md5('QNKCDZO')
此比较为真,因为两个 md5() 哈希值都以 '0e' 开头,因此 PHP 类型转换将这些字符串理解为科学计数法。 根据定义,零的任何次幂都是零。
来自 Digest::MD5 文档
md5($data,...)
此函数将连接所有参数,计算此“消息”的 MD5 摘要,并以二进制形式返回。
md5_hex($data,...)
与 md5() 相同,但将以十六进制形式返回摘要。
PHP 的函数以十六进制形式返回摘要,所以我的猜测是你使用的是 md5() 而不是 md5_hex()。 我已经验证 md5_hex() 生成与 PHP 的 md5() 函数相同的字符串。
(原始评论在多个地方被剪切)
>使用 Perl 的 Digest::MD5 模块生成的十六进制哈希值将
>不等于使用 php 的 md5() 函数生成的哈希值,如果输入
>文本包含任何非字母数字字符。
>
>$phphash = md5('pa$$');
>echo "php original hash from text: $phphash";
>echo "md5 hash from perl: " . $myrow['password'];
>
>输出
>
>php original hash from text: 0aed5d740d7fab4201e885019a36eace
>hash from perl: c18c9c57cb3658a50de06491a70b75cd
我发现多个网站建议使用代码
md5(file_get_contents($filename));
直到最近,我才注意到本地没有问题……但后来我尝试对一个 700MB 的文件进行哈希运算,内存限制为 2048MB,并不断出现内存不足错误……
md5() 函数似乎对可以处理的字符串长度有限制,而且替代函数可能更节省内存。 我强烈建议所有需要文件哈希运算(用于检测重复,而不是安全摘要)的人使用 md5_file() 函数,而不是常规字符串 md5() 函数!
md5_file($filename);
注意,对于那些感兴趣的人来说,由于这是本地应用程序而不是服务器,我更关心结果而不是内存效率。 在生产环境中,你不应该在可以避免的情况下将整个文件一次性读入内存。(在编写代码时,我不知道有替代函数)
<?php
function raw2hex($rawBinaryChars)
{
return = array_pop(unpack('H*', $rawBinaryChars));
}
?>
hey2raw 的补充。
您可以使用它从原始 md5 格式转换为人类可读格式。
这对于检查“Content-Md5”HTTP 标头很有用。
<?php
$rawMd5 = base64_decode($_SERVER['HTTP_CONTENT_MD5']);
$post_data = file_get_contents("php://input");
if(raw2hex($rawMd5) == md5($post_data)) // Post-Data is okay
else // Post-Data is currupted
?>