繁体   English   中英

MD5在VB.net和PHP之间进行哈希处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM