Как вы используете возвращаемое значение raw_output md5 () в PHP? - PullRequest
3 голосов
/ 18 октября 2011

Я довольно неопытен в PHP, так что это может быть очевидным для некоторых из вас, но если я вызываю md5 ($ mystring, true) в PHP, он говорит, что возвращает «сырой двоичный формат длиной 16».Так что это?Это массив?Массив чего?Как мне прочитать отдельные биты и байты этого возвращаемого значения?

Ни один из примеров, которые я могу найти в Интернете, не использует его, не углубляясь в base64_encode () или что-то еще.Я просто хочу иметь возможность проверить, например, пятый бит или третий байт.

Ответы [ 5 ]

3 голосов
/ 18 октября 2011
var_dump(md5("string", TRUE));

«Необработанный двоичный формат» означает строку (поскольку строки в PHP безопасны для двоичного кода):

string(16) "�\����= �(��^{!"

Если вы хотите прочитать из этого байта, используйте для этого синтаксис смещения $string[5]. Или извлечь один бит из пятого байта, например:

$bit4_from_5th_byte = ord($result[5]) & (1 << 4);
1 голос
/ 18 октября 2011

Чтобы получить отдельные биты:

$md5 = md5( "b", true );
$l = strlen( $md5 );
$bits = "";

    for( $i = 0; $i < $l; ++$i ) {
    $num = ord( $md5[$i] );
        for( $j = 7; $j >= 0; --$j ) {
        $bits .= ( $num & ( 1 << $j ) ) ? "1" : "0";
        }

    }

echo $bits."\n";

//10010010111010110101111111111110111001101010111000101111111011000011101011010111000111000111011101110101001100010101011110001111

echo asciibin2hex( $bits ) == md5("b"); // true

Итак, мы идем побайтово, и, поскольку он находится в строковой форме, нам нужно преобразовать его в число ASCII на ord(). Теперь пройдитесь по байтам, понемногу и посмотрите, какие из них включены, а какие выключены, и объедините их со строкой битов. Перейдите к следующему байту, промойте и повторяйте, пока все 128 бит не будут прочитаны.

Считать третий бит (слева) в третьем байте:

ord( $md5[2] ) & ( 1 << ( 8 - 3 ) )

возвращает 1, если бит включен, 0 в противном случае

1 голос
/ 18 октября 2011

RAW-вывод MD5 - это простая двоичная строка хеша.Вы не можете распечатать его на экране, так как он не закодирован как фактические символы ASCII, а двоичные числа.Это полезно только в том случае, если вам нужно сохранить или передать хэш в двоичном формате.

1 голос
/ 18 октября 2011

MD5-хэш - это 128-битное число, например, 16 байтов необработанных двоичных данных. Для удобства чтения функция PHP md5 () по умолчанию выводит ее в виде удобочитаемой строки, где эти 16 двоичных байтов преобразуются в 32-символьную буквенно-цифровую строку.

Когда вы указываете второй параметр true для MD5, вы говорите PHP возвращать это необработанное 128-битное число вместо читаемой человеком версии.

1 голос
/ 18 октября 2011

Возвращает его в виде «строки», где каждый символ является байтом выходных данных.Вместо этого вы можете использовать шестнадцатеричный вывод md5 () без второго параметра и преобразовать его подстроки в числа, используя intval () с 16 в качестве базового параметра.Вот так:

$hash = md5($raw);
$byte = intval(substr($hash, 0, 2), 16);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...