如何将.net HMACMD5哈希转换为php等效?

时间:2018-04-24 19:20:07

标签: php .net vb.net hash md5

我尝试转换为PHP的.NET代码是:

Dim hmac As New HMACMD5(secretPassword)
Dim computedHash As Byte() = hmac.ComputeHash(stringToHash)

目前我正在使用php:

$computedHash = hash_hmac('md5', $stringToHash, $secretPassword);

据我所知,php函数hash_hmac()是正确使用的函数,因为它是如何指定使用md5,但是在测试时两种情况都产生不同的散列结果。我理解.net代码返回一个数组,但数组值与php结果完全不同。

在.net代码中有参数的ascii编码,但我已经验证我的php代码产生相同的编码结果,只有散列产生不同的结果。我还测试了关于两位数字的前导零的编码结果(" 021" vs" 21"),是的,它们产生不同的编码但是当我没有解决哈希问题时试过了。

示例vb .net变量值:

.NET ascii encoded secretPassword "pass123" = [112, 97, 115, 115, 49, 50, 51]
.NET ascii encoded stringToHash "hashstring" = [104, 97, 115, 104, 115, 116, 114, 105, 110, 103] 
.NET hash results = [43, 65, 108, 137, 120, 163, 203, 231, 219, 197, 238, 187, 209, 216, 213, 225]

Php哈希结果(我已经确认我在php中的编码产生与.net相同):

a2c9f74f2597038a39b28538d7f1d73a

1 个答案:

答案 0 :(得分:0)

我想出来,万一有人碰到这个:

如果您获得有关API身份验证的示例VB .NET代码,并且您看到涉及ASCII将数据和密码编码为字节数组的代码,则在尝试使用PHP复制代码时,无需执行此步骤。

PHP本身已经将字符串存储为字节数组,并且它们应该已经是有效的UTF-8格式。所以基本上跳过任何编码步骤,只需插入你的参数并去(params是字符串):

$computedHash       = hash_hmac('md5', $strToHash, self::$password, true);
$computedHashString = base64_encode($computedHash);

您可能需要根据api将最后一个参数更改为false,但是我所说的最常见的情况是最常见的情况,因为api通常期望散列为二进制,然后是64编码。希望这有助于某人〜