2013-08-26 3 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(); 

код РНР, чтобы проверить, если C#, правильно вывода является:

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

C# выдает правильный Unsalted MD5 хэш, который является 202cb962ac59075b964b07152d234b70. Однако, когда я пытаюсь использовать соль, я получаю 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, все, что вам нужно сделать, - запустить MD5 на stringToHash + saltToUse вместо использования ключевой функции HMACMD5. Короче говоря, сделайте именно то, что вы сделали для создания своего несоленого MD5 в C#, но вместо этого перейдите в stringToHash + saltToUse.

+0

Да, ваша идея была права, тоже. Спасибо за быстрые ответы. – MathMan08