我有一个字符串,需要在 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 代码更好的加盐机制。要匹配 PHP,您所需要做的就是在 stringToHash + saltToUse
上运行 MD5,而不是使用 HMACMD5 的关键功能。简而言之,完全按照您在 C# 中生成未加盐 MD5 的操作,但改为传入 stringToHash + saltToUse
。
关于C# MD5 哈希需要匹配 PHP MD5 哈希(带盐),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18451182/