C#MD5散列需要匹配PHP MD5散列(含盐)

时间:2013-08-26 19:04:40

标签: c# php hash salt

我有一个字符串,需要在C#中使用salt进行哈希处理并匹配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输出的内容。

2 个答案:

答案 0 :(得分:2)

C#代码使用比PHP代码更好的salting机制。要匹配PHP,您需要做的就是在stringToHash + saltToUse上运行MD5,而不是使用HMACMD5的主要功能。简而言之,完全按照您在C#中制作未加盐的MD5所做的工作,而是传入stringToHash + saltToUse

答案 1 :(得分:1)

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

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