Intereting Posts
PHP-файл не может восстанавливать переменную сеанса на разных страницах Невозможно установить phpDocumentor через Composer Сортируемый список JQuery UI улавливание значений мультиселектора в поле выбора базовый расчет даты для проверки истечения срока действия Mysql бросает ошибку запроса, но заканчивая запрос просто отлично? Допустимо ли использовать сочетание объектно-ориентированного стиля с процедурным стилем в кодировании PHP? Загружать session_start () только в том случае, если сеанс не существует? как получить множественный набор результатов из хранимой процедуры mysql в laravel Как правильно отступать PHP / HTML смешанный код? Добавить параметры входа Joomla Как декодировать строку JSON Как вставить JS-код Google Merchant Review в страницу завершения заказа WooCommerce просмотр pdf-файлов, хранящихся в базе данных mySQL, с использованием ошибки PHP Как правильно обрабатывать токен доступа и доступа к Facebook с помощью PHP SDK 3.0?

Можете ли вы преобразовать вывод php crypt () в действительный MD5?

У меня есть несколько строк, которые были зашифрованы с помощью функции PHP crypt() .

Выходы выглядят примерно так:

 $1$Vf/.4.1.$CgCo33ebiHVuFhpwS.kMI0 $1$84..vD4.$Ps1PdaLWRoaiWDKCfjLyV1 $1$or1.RY4.$v3xo04v1yfB7JxDj1sC/J/ 

Хотя я считаю, что crypt () использует алгоритм MD5, выходы недействительны хэшам MD5.

Есть ли способ преобразования полученных хэшей в допустимые хеши MD5 (16-байтовые шестнадцатеричные значения)?


Обновить:

Спасибо за ответы, так что ответы до сих пор. Я уверен, что используемая функция криптографии использует какой-то алгоритм MD5. То, что я хочу сделать, – это преобразовать вывод, который у меня есть в хеше MD5, который выглядит примерно так:

 9e107d9d372bb6826bd81d3542a419d6 e4d909c290d0fb1ca068ffaddf22cbd0 d41d8cd98f00b204e9800998ecf8427e 

(взято из Википедии )

Есть ли способ перехода от хэшей, которые у меня есть к таким, как выше?

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

 $1$ # this indicates that it is MD5 Vf/.4.1. # these eight characters are the significant portion of the salt $ # this character is technically part of the salt, but it is ignored CgCo33eb # the last 22 characters are the actual hash iHVuFhpw # they are base64 encoded (to be printable) using crypt's alphabet S.kMI0 # floor(22 * 6 / 8) = 16 (the length in bytes of a raw MD5 hash) 

Насколько мне известно, алфавит, используемый склепом, выглядит так:

 ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 

Итак, с учетом всего этого, вот как вы можете преобразовать хеш-память crypt-base64 из 22 символов в 32-х значный base16 (шестнадцатеричный) хеш:

Во-первых, вам нужно что-то, чтобы преобразовать base64 (с пользовательским алфавитом) в 16-байтовый MD5-хэш.

 define('CRYPT_ALPHA','./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'); /** * Decodes a base64 string based on the alphabet set in constant CRYPT_ALPHA * Uses string functions rather than binary transformations, because said * transformations aren't really much faster in PHP * @params string $str The string to decode * @return string The raw output, which may include unprintable characters */ function base64_decode_ex($str) { // set up the array to feed numerical data using characters as keys $alpha = array_flip(str_split(CRYPT_ALPHA)); // split the input into single-character (6 bit) chunks $bitArray = str_split($str); $decodedStr = ''; foreach ($bitArray as &$bits) { if ($bits == '$') { // $ indicates the end of the string, to stop processing here break; } if (!isset($alpha[$bits])) { // if we encounter a character not in the alphabet return false; // then break execution, the string is invalid } // decbin will only return significant digits, so use sprintf to pad to 6 bits $decodedStr .= sprintf('%06s', decbin($alpha[$bits])); } // there can be up to 6 unused bits at the end of a string, so discard them $decodedStr = substr($decodedStr, 0, strlen($decodedStr) - (strlen($decodedStr) % 8)); $byteArray = str_split($decodedStr, 8); foreach ($byteArray as &$byte) { $byte = chr(bindec($byte)); } return join($byteArray); } 

Теперь, когда у вас есть необработанные данные, вам понадобится метод, чтобы преобразовать его в формат base-16, который вы ожидаете, что не может быть проще.

 /** * Takes an input in base 256 and encodes it to base 16 using the Hex alphabet * This function will not be commented. For more info: * @see http://php.net/str-split * @see http://php.net/sprintf * * @param string $str The value to convert * @return string The base 16 rendering */ function base16_encode($str) { $byteArray = str_split($str); foreach ($byteArray as &$byte) { $byte = sprintf('%02x', ord($byte)); } return join($byteArray); } 

Наконец, поскольку вывод крипты включает в себя множество данных, которые нам не нужны (и, фактически, не могут их использовать) для этого процесса, короткая и сладкая функция не только связывать эти два вместе, но и допускать прямой ввод вывода из склепа.

 /** * Takes a 22 byte crypt-base-64 hash and converts it to base 16 * If the input is longer than 22 chars (eg, the entire output of crypt()), * then this function will strip all but the last 22. Fails if under 22 chars * * @param string $hash The hash to convert * @param string The equivalent base16 hash (therefore a number) */ function md5_b64tob16($hash) { if (strlen($hash) < 22) { return false; } if (strlen($hash) > 22) { $hash = substr($hash,-22); } return base16_encode(base64_decode_ex($hash)); } 

Учитывая эти функции, представление base16 трех ваших примеров:

 3ac3b4145aa7b9387a46dd7c780c1850 6f80dba665e27749ae88f58eaef5fe84 ec5f74086ec3fab34957d3ef0f838154 

Конечно, важно помнить, что они всегда были действительны, только отформатированы по-разному.

$ 1 $ действительно означает, что это хеш MD5, но крипт генерирует случайную соль. Вот почему вы находите другое значение MD5. Если вы включите генерируемую соль, вы получите тот же результат.

Соль имеет base64, закодированную на выходе, как хэш.

Используемый алгоритм является системным параметром. Как правило, это MD5, вы правы.

Я считаю, что ответ на мой первоначальный вопрос – нет, вы не можете конвертировать из одного формата в другой.

Хеши, сгенерированные php crypt (), по-видимому, генерируются версией хеш-реализации FreeBSD MD5, созданной Poul-Henning Kamp.

http://people.freebsd.org/~phk/

Из документации это зависит от системы. Вы можете заставить алгоритм использовать параметр соли. Из документов:

Тип шифрования инициируется аргументом salt. Во время установки PHP определяет возможности функции криптографии и принимает соли для других типов шифрования. Если соль не предоставляется, PHP будет автоматически генерировать стандартную соль с двумя символами по умолчанию, если по умолчанию тип шифрования в системе не MD5, и в этом случае генерируется случайная соль, совместимая с MD5.

Из http://php.net/crypt :

crypt () вернет зашифрованную строку, используя стандартный алгоритм шифрования на основе Unix DES или альтернативные алгоритмы, которые могут быть доступны в системе.

Вы хотите функцию md5() :

Вычисляет хэш MD5 str, используя «RSA Data Security, Inc. MD5 Message-Digest Algorithm» и возвращает этот хеш.
Если для опции raw_output установлено значение TRUE, то вместо этого md5 digest возвращается в необработанном двоичном формате с длиной 16. По умолчанию FALSE.