繁体   English   中英

C#MD5哈希需要匹配PHP MD5哈希(加盐)

[英]C# MD5 hashing needs to match PHP MD5 hashing (with 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输出的内容。

与PHP代码相比,C#代码使用的盐析机制更好。 为了匹配PHP,您需要做的只是在stringToHash + saltToUse上运行MD5,而不是使用HMACMD5的关键功能。 简而言之,完全按照您在C#中生成未加盐的MD5的方式进行操作,而是传入stringToHash + saltToUse

盐和私钥不是一回事。 当您需要的只是盐腌的MD5哈希时, HMACMD5使用私钥。 只需将salt添加到字符串即可生成正确的密钥... stringToHash + saltToUse

在此处阅读有关HMACMD5信息: http : //msdn.microsoft.com/zh-cn/library/yd9e7dt2.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM