2009-05-04 3 views
7

я есть алгоритм хэширования в C#, в двух словах, это:PHP md5 алгоритм, который дает такой же результат, как с #

string input = "asd"; 

System.Security.Cryptography.MD5 alg = System.Security.Cryptography.MD5.Create(); 
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); 


byte[] hash = alg.ComputeHash(enc.GetBytes(input)); 
string output = Convert.ToBase64String(hash); 

// outputs: eBVpbsvxyW5olLd5RW0zDg== 
Console.WriteLine(output); 

Теперь нужно повторить это поведение в PHP,

$input = "asd"; 
$output = HashSomething($input); 
echo $output; 

Как я могу это достичь?

Я проверил

  • md5
  • utf8_decode
  • utf8_encode
  • base64_encode
  • base64_decode
  • url_decode

, но я отметил PHP md5 не получает == на конце ... что мне не хватает?

ПРИМЕЧАНИЕ: Я не могу изменить поведение C#, потому что оно уже реализовано и пароли, сохраненные в моем db с помощью этого алгоритма.

ответ

18

Проблема заключается md5() функция в PHP по умолчанию возвращает шестнадцатеричный вариации хэш где C# возвращается необработанный выходной байт, который затем должен быть сделан текст безопасным с кодировкой base64. Если вы используете PHP5, вы можете использовать base64_encode(md5('asd', true)). Обратите внимание, что второй параметр равен md5(), который возвращает md5() исходные байты вместо шестнадцатеричного.

+4

Истинный флаг для md5 существует только в PHP5 или выше. В более ранних версиях вам нужно будет вызвать функцию пакета. – jmucchiello

5

Вы помните, что base64 кодировал хеш-память md5 в php?

$result = base64_encode(md5($password, true));

Второй параметр делает md5 возврата сырой выход, который является таким же, как и функции, которые вы используете в C#

+0

штопать. Вы ставите меня ... == Обычно это из кодировки Base64, которую вы делаете с Convert.ToBase64String(), это то, что вам не хватает? –

+0

Ничего себе. Полностью пропущена эта строка в коде C#. –

+0

Да, но как я могу достичь этого на php? какую функцию я должен использовать? –

4

Ваш C# код берет UTF8 байты из строки; вычисляет md5 и сохраняет в кодировке base64. Таким образом, вы должны сделать то же самое в PHP, который должен быть:

$hashValue = base64_encode(md5(utf8_decode($inputString))) 
0

У меня была такая же проблема ... используя только md5 ($ myvar), сработало. Я получаю тот же результат C# и PHP.

-1

Опубликованный Gavin Kendall помог мне. Надеюсь, это поможет другим.

http://jachman.wordpress.com/2006/06/06/md5-hash-keys-with-c/

public static string MD5Hash(string text) 
{ 
    System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
    return System.Text.RegularExpressions.Regex.Replace(BitConverter.ToString(md5.ComputeHash(ASCIIEncoding.Default.GetBytes(text))), “-”, “”); 
} 
1

она должна быть как ниже для PHP

php -r "echo base64_encode(md5(utf8_encode('asd'),true));" 
Смежные вопросы