PHP MD5与C#MD5不匹配



我在C#中有一个哈希方法,看起来像:

MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] raw_input  = Encoding.UTF32.GetBytes("hello");
byte[] raw_output = md5.ComputeHash(raw_input);
string output = "";
foreach (byte myByte in raw_output)
    output += myByte.ToString("X2");
return output;

如何在PHP中实现这一点?执行以下操作将生成不同的哈希摘要。。。

$output = hash('md5', 'hello');

PHP

这个PHP代码将做:

<?php
$str = "admin";
$strUtf32 = mb_convert_encoding($str, "UTF-32LE");
echo md5($strUtf32);
?>

该代码输出"1e3fcd02b1547f847cb7fc3add4484a5"

您需要了解PHP使用哪种编码将字符串转换为文本。它不太可能使用UTF-32。它很可能使用平台默认编码,或者可能使用UTF-8。

using (MD5 md5 = MD5.Create())
{
    byte[] input = Encoding.UTF8.GetBytes("hello");
    byte[] hash = md5.ComputeHash(input);
    return BitConverter.ToString(hash).Replace("-", "");
}

(这是将字符串视为二进制数据的语言/平台的问题-它并不能清楚地说明发生了什么。在这里有到字节的转换,因为MD5是为字节而不是Unicode字符定义的。在C#代码中,你是显式地这样做的……在PHP中,它是隐式的,而且记录不好。)

编辑:如果你必须更改PHP,你可以尝试这个:

$text = mb_convert_encoding($text, "UTF-32LE");
$output = md5($text)

这取决于PHP是否支持UTF-32。。。

当您将md5应用于Encoding.UTF32.GetBytes("admin");时,这与相同

echo hash( "md5","admin");
//1e3fcd02b1547f847cb7fc3add4484a5

在php中。

您需要在PHP:中将字符串转换为UTF32-LE

echo md5( mb_convert_encoding( "admin", "UTF-32LE" ) );
//1e3fcd02b1547f847cb7fc3add4484a5

最新更新