C#MD5哈希需要匹配PHP MD5哈希(带salt)

本文关键字:哈希 salt MD5 PHP 哈希需 C#MD5 | 更新日期: 2023-09-27 18:29:02

我有一个字符串需要在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#进行salt时,我得到900011ae860f471561023fba6cc25df6,而使用PHP,我得到c8837b23ff8aaa8a2dde915473ce0991。

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

C#MD5哈希需要匹配PHP MD5哈希(带salt)

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

salt与私钥不是一回事。HMACMD5使用私钥,而您所需要的只是一个加盐的MD5散列。只需将salt附加到字符串即可生成正确的密钥。。。stringToHash + saltToUse

点击此处了解HMACMD5:http://msdn.microsoft.com/en-us/library/yd9e7dt2.aspx