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# は、202cb962ac59075b964b07152d234b70 である正しい UNSALTED MD5 ハッシュを出力します。ただし、C# を使用してソルトしようとすると、900011ae860f471561023fba6cc25df6 が返され、PHP では c8837b23ff8aaa8a2dde915473ce0991 が返されます。
なぜこれを行っているのか、これが正しい方法なのかはわかりません。覚えておくべきことは、C# は PHP が出力するものに出力する必要があるということです。