【问题标题】:MD5 Hashing between VB.net and PHPVB.net 和 PHP 之间的 MD5 哈希
【发布时间】:2012-01-21 06:24:52
【问题描述】:

在@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));

我试过了,但是 md5sum 不匹配。我认为它是编码,但也许它与字节数组有关,任何人都可以对此有所了解吗?仅供参考,我无法更改 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))))

根据另一个问题

【问题讨论】:

标签: php .net md5


【解决方案1】:

不清楚您是如何比较结果的,但编码*绝对是个问题 - 您在 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,如 cmets 中所建议的那样。当然,您需要知道现有的编码是什么......

【讨论】:

  • 好点,我会更新帖子,但我怕我不能改变VB。
  • @scottkf 您可以使用 PHP 中的 mbstring 将 UTF8 转换为 UTF16。
  • @jon-skeet 那么以下不应该产生正确的结果吗? $string = mb_convert_encoding(utf8_encode($signature), 'UTF-8', 'UTF-16');$md5 = (md5($string, true));
  • @scottkf:不,因为您仍然将 UTF-16 版本编码为 UTF-8(实际上,由于 utf8_encode 的输入需要 iso-8859-1 ) 在将其传递给 md5 之前。如果没有最终的 utf8_encode,可能就可以了。但我对 PHP 的字符串表示的了解还不够,无法确定。
  • @JonSkeet:问题在于字节的表示。 VB.net 将 LE 用于 UTF-16,而 PHP 的 UTF-16 实际上是大端。解决方案是:$string = mb_convert_encoding($signature, 'UTF-16LE', 'UTF-8'); $encoded_signature = base64_encode(md5($string, true)); 已通过以下方式验证:$raw = unpack('C*', $string); print_r($raw);
【解决方案2】:

解决方案与字节顺序有关: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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 2015-07-07
    • 1970-01-01
    • 2023-03-22
    • 2012-05-28
    • 2014-05-19
    • 2021-09-22
    • 2019-10-10
    相关资源
    最近更新 更多