簡體   English   中英

PHP MD5與C#MD5不匹配

[英]PHP MD5 not matching 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使用哪種編碼將字符串轉換為文本。 這是不太可能,它使用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 ...

的PHP

此PHP代碼將執行以下操作:

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

此代碼輸出“ 1e3fcd02b1547f847cb7fc3add4484a5”

md5應用於Encoding.UTF32.GetBytes("admin"); ,與

echo hash( "md5","a\0\0\0d\0\0\0m\0\0\0i\0\0\0n\0\0\0");
//1e3fcd02b1547f847cb7fc3add4484a5

在php中。

您需要在PHP中將字符串轉換為UTF32-LE:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM