php md5, который дает тот же результат, что и c #

У меня есть алгоритм хеширования в C #, в двух словах:

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 с помощью этого алгоритма.

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

Вы помните, что base64 кодирует хеш md5 в php?

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

Второй параметр делает md5 return raw output, который аналогичен функциям, которые вы используете в C #

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

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

это должно быть как указано ниже для php

  php -r "echo base64_encode(md5(utf8_encode('asd'),true));" 

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

Рассказ Гавина Кендалла помог мне. Надеюсь, это поможет другим.

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))), “-”, “”); }