如果我改变输入字符串,为什么哈希变得不同?
我的C#代码是:
public static string CreateMD5(string strInput)
{
using (MD5 md5 = MD5.Create())
{
byte[] inputBytes = Encoding.UTF8.GetBytes(strInput);
byte[] hashBytes = md5.ComputeHash(inputBytes);
string hashedString = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
return hashedString;
}
}
在PHP中,我使用md5()
函数。这是一个在线服务,所以我没有源代码;我只是使用该网站来匹配结果。
如果我有这个字符串:
test-server::7250406f7c43524545f794ff50dfd15b
哈希是相同的:20202421c846813960404af7dd36c146
。但是,如果我将字符串扩展为此(带编码字符):
test-server::7250406f7c43524545f794ff50dfd15b::name=%D0%98%D0%BD%D0%B5%D1%81%D1%81%D0%B0
现在哈希值不同:3db825e09eae0a83db535fda7f5ee5b5
和ee1ae334e4bdeceb54caab15555f2f40
。
为什么会这样?
答案 0 :(得分:4)
哈希值ee1ae334e4bdeceb54caab15555f2f40
是test-server::7250406f7c43524545f794ff50dfd15b::name=Инесса
上的MD5哈希值。此输入是test-server::7250406f7c43524545f794ff50dfd15b::name=%D0%98%D0%BD%D0%B5%D1%81%D1%81%D0%B0
的URL解码版本。
您的C#代码片段在未解码的版本上执行MD5。 PHP默认解码GET
,因此为了获得相同的结果,您需要对设置为PHP脚本的值进行双重编码。
见这里,https://3v4l.org/rK7fi(在线PHP代码实现):
GET变量通过urldecode()传递。
http://php.net/manual/en/reserved.variables.get.php
或者,如果在对C#中的值进行URL编码之前对MD5值进行编码,则系统应返回相同的哈希值。