【问题标题】:C# MD5 hashing needs to match PHP MD5 hashing (with salt)C# MD5 散列需要匹配 PHP MD5 散列(加盐)
【发布时间】:2013-08-29 08:37:16
【问题描述】:

我有一个字符串,需要在 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 输出到的内容。

【问题讨论】:

    标签: c# php hash salt


    【解决方案1】:

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

    【讨论】:

    • 是的,你的想法也是对的。感谢您的快速回复。
    【解决方案2】:

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

    在此处了解HMACMD5http://msdn.microsoft.com/en-us/library/yd9e7dt2.aspx

    【讨论】:

    • byte[] stringBytes = ASCIIEncoding.ASCII.GetBytes(stringToHash + saltToUse);这样做并且效果很好,谢谢!
    • 你能解释一下它是怎么不工作的吗?也许打开一个新问题?
    • 会的。再次感谢,我将重新编辑它并按照原始哈希+盐的方式备注此权利。