2

我有一个字符串需要在 C# 中使用盐进行散列并匹配它在 PHP 中的内容。C#代码如下:

        string stringToHash = "123";
        string saltToUse = "321";
        byte[] stringBytes = ASCIIEncoding.ASCII.GetBytes(stringToHash);
        byte[] saltBytes = ASCIIEncoding.ASCII.GetBytes(saltToUse);

        var hmacMD5 = new HMACMD5(saltBytes);
        var saltedHash = hmacMD5.ComputeHash(stringBytes);
        byte[] hashedBytesNoSalt = MD5CryptoServiceProvider.Create().ComputeHash(stringBytes);

        string hashedString = BitConverter.ToString(hashedBytesNoSalt).Replace("-", "").ToLower();
        string saltedString = BitConverter.ToString(saltedHash).Replace("-", "").ToLower();

测试 C# 是否正确输出的 PHP 代码是:

<?php echo md5('123'.'321'); ?>

C# 输出正确的 UNSALTED MD5 哈希,即 202cb962ac59075b964b07152d234b70。但是,当我尝试使用 C# 加盐时,我得到 900011ae860f471561023fba6cc25df6,而使用 PHP 我得到 c8837b23ff8aaa8a2dde915473ce0991。

我不确定它为什么这样做,或者这是否是正确的方法。要记住的是 C# 需要输出到 PHP 输出的内容。

4

2 回答 2

2

C# 代码使用比 PHP 代码更好的加盐机制。要匹配 PHP,您需要做的就是运行 MD5stringToHash + saltToUse而不是使用 HMACMD5 的关键功能。简而言之,完全按照您在 C# 中生成 unsalted MD5 所做的操作,但stringToHash + saltToUse改为传入。

于 2013-08-26T19:12:10.373 回答
1

盐与私钥不同。HMACMD5使用私钥,而您只需要一个加盐的 MD5 哈希。只需将盐附加到字符串即可生成正确的密钥stringToHash + saltToUse...。

在这里阅读:http HMACMD5: //msdn.microsoft.com/en-us/library/yd9e7dt2.aspx

于 2013-08-26T19:15:22.923 回答