2013-12-03 2 views
0

Этот проект представляет собой простой интерфейс REST через HTTPS. Я пытаюсь хэш передаваемых данных, поэтому я могу убедиться, что он не был изменен во время транспортировки (с использованием соли, конечно). Однако, похоже, что-то не так с моим кодом. Сервер REST - это PHP, а клиент - C#.Как создать хэш, который можно прочитать на PHP и C#?

PHP

public function hash($text) 
{ 
    $text = utf8_encode($text); 
    $encrypted = hash("sha512", $text); 
    return base64_encode($encrypted); 
} 

C#

public static string Hash(string Plaintext) 
{ 
    byte[] HashValue, MessageBytes = Encoding.UTF8.GetBytes(Plaintext); 

    SHA512Managed SHhash = new SHA512Managed(); 

    HashValue = SHhash.ComputeHash(MessageBytes); 

    return Convert.ToBase64String(HashValue); 
} 

Они не производят тот же хэш. Что я делаю не так?

+0

Вы пробовали пошаговый 3 шаг и сравнение выходных? – AbraCadaver

+0

Возможно, ваши исходные данные уже разные. C# и PHP используют разные типы для ваших входных данных. Вы уверены, что фактическое двоичное содержимое обоих точно такое же, прежде чем вы их используете? – ToBe

+0

убедитесь, что кодировка utf8 абсолютно идентична перед хешированием. sha512 - sha512, поэтому, если у вас разные хэши, у вас разные входы. –

ответ

0

В соответствии с this edit ОП, это решение:

Во-первых, хэш в PHP возвращает шестнадцатеричное по умолчанию, в то время как в C# возвращает исходные данные. Закончен, необходимо изменить hash("sha512", $text) на hash("sha512", $text, true). Во-вторых, utf8_encode, похоже, не делает то же самое как C# Encoding.UTF8.GetBytes; когда я переключил utf8_encode($text) на mb_convert_encoding($text, 'UTF-16LE') и Encoding.UTF8.GetBytes на new UnicodeEncoding().GetBytes, хеши начали совпадать.

Короче говоря, окончательный рабочий код:

PHP

public function hash($text) 
{ 
    $text = mb_convert_encoding($text, 'UTF-16LE'); 
    $encrypted = hash("sha512", $text, true); 
    return base64_encode($encrypted); 
} 

C#

public static string Hash(string Plaintext) 
{ 
    byte[] HashValue, MessageBytes = new UnicodeEncoding().GetBytes(Plaintext); 

    SHA512Managed SHhash = new SHA512Managed(); 

    HashValue = SHhash.ComputeHash(MessageBytes); 

    return Convert.ToBase64String(HashValue); 
} 
+0

Не забудьте удалить объект SHA512Managed после использования. Подумайте об использовании 'using'. –

Смежные вопросы