[英]MD5 Hashing between VB.net and PHP
在@JonSkeet的帮助下回答
鉴于此代码:
Dim data1ToHash As Byte() = (New UnicodeEncoding).GetBytes(input)
' 2. Hash the byte array
Dim hashvalue1 As Byte() = CType(CryptoConfig.CreateFromName("MD5"), HashAlgorithm).ComputeHash(data1ToHash)
这个PHP不应该产生正确的哈希吗?
$md5 = (md5(utf8_encode($signature), true));
我试过了,但是md5sums没有匹配。 我以为它是编码,但也许它与字节数组有关,任何人都可以对此有所了解吗? 仅供参考我不能改变VB
要比较结果:
在.Net
For Each b As Byte In hashvalue1
tb.Text = tb.Text & b.ToString() & ","
Next
tb.Text = tb.Text.Trim(",")
用PHP
print_r(unpack('C*', pack('H*', md5($signature))))
按照另一个问题
目前还不清楚你是如何比较结果的,但编码肯定是个问题 - 你在VB代码中使用UTF-16,在PHP中使用UTF-8。 您可以像这样更改VB代码:
Dim data1ToHash As Byte() = Encoding.UTF8.GetBytes(input)
MD5部分也可以简化,结果如下:
Dim unhashed As Byte() = Encoding.UTF8.GetBytes(input)
Dim hashed As Byte() = MD5.Create().ComputeHash(unhashed)
编辑:如果你不能改变VB,你需要改变PHP使用UTF-16,可能与评论中建议的mbstring一样。 你需要知道现有的编码是什么,当然......
解决方案与字节排序有关:UTF-16中的.NET是Little Endian,而PHP的默认UTF-16编码是Big Endian。 所以答案是:
mb_internal_encoding('UTF-8');
$string = mb_convert_encoding($signature, 'UTF-16LE', 'UTF-8');
$encoded_signature = base64_encode(md5($string, true));
为了验证,我比较了PHP和.NET中的UTF-16编码字节:
print_r(unpack('C*', $string));
就这么简单。 感谢所有帮助过的人,特别是@JonSkeet。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.