Что зашифровывается, когда я использую соленый CRYPT_MD5 для шифрования моего пароля? - PullRequest
4 голосов
/ 14 января 2010

Использование md5 в строке всегда приводит к буквенно-цифровому зашифрованному результату, т.е.: без символов.

Однако, когда я использую функцию php crypt (), в частности CRYPT_MD5 (и он включен, я проверил) с солью, предполагаемый хэш md5, который он возвращает, не похож на хеш md5.

Например:

если я введу md5 строку 'пароль', я получу:

$pass = md5('password');
echo $pass;
//5f4dcc3b5aa765d61d8327deb882cf99

если я использую CRYPT_MD5, который обозначается префиксом '$ 1 $' и суффиксом '$', где соль является солью:

$pass = crypt('password', '$1$salt$');
echo $pass;
//$1$salt$qJH7.N4xYta3aEG/dfqo/0

Теперь используемый алгоритм и соль показаны как и ожидалось, «$ 1 $» показывает, что был использован CRYPT_MD5, а соль показана как «соль» между знаками $.

Однако ... хешированный пароль после этого последнего знака $ не похож на md5 ... в нем есть косые черты и точки остановки.

Почему это так хешируется? Разве это не настоящий MD5?

Пожалуйста, спросите, нужна ли вам я, чтобы уточнить что-либо из этого. Тьфу.

Ответы [ 4 ]

10 голосов
/ 14 января 2010
  1. MD5 - это алгоритм хеширования, а не шифрование.
  2. Вывод MD5 составляет 128 бит данных. Ваш первый пример - кодирование 128 битов как 32 шестнадцатеричных цифр (4 бита на цифру). Второй пример в алфавите склепа ./0-9A-Za-z - 21 символ по 6 бит на символ.

Подробнее об алгоритме шифрования см. http://www.gnu.org/software/libtool/manual/libc/crypt.html

1 голос
/ 16 января 2010

Вы правы, 5f4dcc3b5aa765d61d8327deb882cf99 - это MD5 строки «пароль». Соль не добавлена, но вы можете легко добавить ее, взяв MD5 ("пароль". "Salt")

Однако функция PHP crypt () может использовать различные хеши для вычисления хеша. Когда вы добавляете соль к «$ 1 $», вы получаете хеш с MD5. Когда вы префикс $ 2 $, вы получите склеп с Blowfish, который является более безопасным.

"$ 1 $" добавляется к выходу, чтобы можно было проверить хеш. Если бы оно не было включено, не было бы способа узнать из хранимого хэша, какой алгоритм следует использовать! Эта информация должна храниться в другом месте. Чтобы избавить вас от этой проблемы, PHP включает алгоритм в вывод хеша.

Таким образом, чтобы проверить хеш, вы берете пароль, предоставленный пользователем, в качестве пароля, и берете все до третьего знака доллара в качестве соли, и вы видите, соответствуют ли полученные вами результаты сохраненным результатам.

Следующая часть вашего замешательства состоит в том, что функция MD5 () дает вам шестнадцатеричный хеш, тогда как функция crypt () дает вам хэш, закодированный в Base64. Это потому, что Base64 более эффективен.

Simple

0 голосов
/ 14 января 2010

Это хеш MD5, только неправильно отформатированный как строка. Не должно доставить вам проблем.

0 голосов
/ 14 января 2010

Это мои мысли - не уверен, правильно ли. md5 вычисляет хэш, тогда как crypt выполняет шифрование, хотя и использует разновидность md5. Хэши являются односторонними и дают результаты фиксированной длины для ввода произвольной длины. Шифрование является двусторонним и не дает результатов фиксированной длины.

Я предполагаю, что хэш md5 rfc, вероятно, определяет результат для использования [a-z], [A-Z], [0-9], тогда как шифрование не имеет такого ограничения.

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