алгоритм php md5, который дает тот же результат, что и c # - PullRequest
8 голосов
/ 05 мая 2009

У меня есть алгоритм хеширования в 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 #, потому что оно уже реализовано и пароли сохраняются в моей БД с помощью этого алгоритма.

Ответы [ 6 ]

20 голосов
/ 05 мая 2009

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

5 голосов
/ 05 мая 2009

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

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

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

4 голосов
/ 05 мая 2009

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

$hashValue = base64_encode(md5(utf8_decode($inputString)))
1 голос
/ 22 марта 2012

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

 php -r "echo base64_encode(md5(utf8_encode('asd'),true));"
0 голосов
/ 09 февраля 2012

Помещенный Гэвин Кендалл помог мне. Я надеюсь, что это помогает другим.

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))), “-”, “”);
}
0 голосов
/ 09 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...