2013-08-26 2 views
2

C#에서 소금을 사용하여 해싱해야하는 문자열이 있고 PHP에서와 일치해야합니다. 다음과 같이 C# 코드이다 :C# MD5 해시는 PHP MD5 해싱 (소금)과 일치해야합니다.

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

는 C#이 202cb962ac59075b964b07152d234b70이고 정확한 무염 MD5 해시를 출력하고, 다음 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(); 

PHP 코드는 테스트. 그러나 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 코드보다 더 나은 소금 매커니즘을 사용하고 있습니다. PHP와 일치 시키려면 HMACMD5의 주요 기능을 사용하는 대신 stringToHash + saltToUse에서 MD5를 실행하면됩니다. 즉, C#에서 무염의 MD5를 제작 한 것과 정확히 똑같은 작업을 수행하고 대신 stringToHash + saltToUse을 전달하십시오.

+0

예, 당신의 생각도 옳았다. 빠른 응답에 감사드립니다. – MathMan08