2013-08-26 133 views
2

我有一個字符串,需要在C#中使用鹽進行散列並匹配它在PHP中的內容。 C#代碼如下:C#MD5散列需要匹配PHP MD5哈希(與鹽)

 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(); 

PHP代碼以測試是否C#正在輸出正確地是:

<?php echo md5('123'.'321'); ?> 

的C#輸出了正確的無鹽MD5哈希,這是202cb962ac59075b964b07152d234b70。但是,當我嘗試使用C#進行鹽化時,我得到了900011ae860f471561023fba6cc25df6和PHP,我得到了c8837b23ff8aaa8a2dde915473ce0991。

我不知道它爲什麼這樣做,或者如果這是正確的方法。需要記住的是C#需要輸出到PHP輸出的內容。

回答

1

鹽和私鑰不是一回事。 HMACMD5使用私鑰,當你想要的只是一個鹽醃的MD5哈希。只需將鹽附加到字符串以生成正確的密鑰... stringToHash + saltToUse

閱讀HMACMD5這裏:http://msdn.microsoft.com/en-us/library/yd9e7dt2.aspx

+1

byte [] stringBytes = ASCIIEncoding.ASCII.GetBytes(stringToHash + saltToUse); 做到了這一點,它完美的作品,謝謝! – MathMan08

+0

雖然它不適用於複雜的鹽。 :| – MathMan08

+0

你能解釋它是如何不起作用的嗎?也許開一個新的問題? – Haney

2

C#代碼使用比PHP代碼更好的salting機制。爲了匹配PHP,您需要做的就是在stringToHash + saltToUse上運行MD5,而不是使用HMACMD5的關鍵功能。簡而言之,請按照您在C#中生成無鹽MD5所做的那樣做,而是通過stringToHash + saltToUse來代替。

+0

是的,你的想法是正確的,太。感謝您的快速響應。 – MathMan08