我有一个字符串,需要在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输出的内容。
答案 0 :(得分:2)
C#代码使用比PHP代码更好的salting机制。要匹配PHP,您需要做的就是在stringToHash + saltToUse
上运行MD5,而不是使用HMACMD5的主要功能。简而言之,完全按照您在C#中制作未加盐的MD5所做的工作,而是传入stringToHash + saltToUse
。
答案 1 :(得分:1)
salt与私钥不同。 HMACMD5
使用私钥,当你想要的只是一个盐渍的MD5哈希。只需将salt附加到字符串即可生成正确的密钥... stringToHash + saltToUse
。
在此处阅读HMACMD5
:http://msdn.microsoft.com/en-us/library/yd9e7dt2.aspx