Функция "MD5 расшифровывает" php к хранимой функции MySQL - PullRequest
0 голосов
/ 14 января 2012

Я пытаюсь исправить ситуацию на PHP-сайте. Есть пара функций PHP:

function get_rnd_iv($iv_len) {
        $iv = '';
        while ($iv_len-- > 0) {
                $iv .= chr(mt_rand() & 0xff);
        }
        return $iv;
}
function md5_encrypt($plain_text, $password, $iv_len = 16) {
        $plain_text .= "\x13";
        $n = strlen($plain_text);
        if ($n % 16) $plain_text .= str_repeat("\0", 16 - ($n % 16));
        $i = 0;
        $enc_text = get_rnd_iv($iv_len);
        $iv = substr($password ^ $enc_text, 0, 512);
        while ($i < $n) {
                $block = substr($plain_text, $i, 16) ^ pack('H*', md5($iv));
                $enc_text .= $block;
                $iv = substr($block . $iv, 0, 512) ^ $password;
                $i += 16;
        }
        return base64_encode($enc_text);
}
function md5_decrypt($enc_text, $password, $iv_len = 16) {
        $enc_text = base64_decode($enc_text);
        $n = strlen($enc_text);
        $i = $iv_len;
        $plain_text = '';
        $iv = substr($password ^ substr($enc_text, 0, $iv_len), 0, 512);
        while ($i < $n) {
                $block = substr($enc_text, $i, 16);
                $plain_text .= $block ^ pack('H*', md5($iv));
                $iv = substr($block . $iv, 0, 512) ^ $password;
                $i += 16;
        }
        return preg_replace('/\\x13\\x00*$/', '', $plain_text);
}

Они используются для шифрования IP-адресов пользователей в базе данных. Параметр $ password хранится в конфигурационном файле php (поэтому только выгрузка sql не даст вам IP-адреса, даже если вы знаете эти функции).

Я все еще озадачен ими, поскольку MD5 явно хэширует, и только такие вещи, как брутфорс, могут обратить его вспять.

Может кто-нибудь с большим опытом php объяснить, как работает эта расшифровка? Зашифрованный текст не является простым MD5, поэтому мне, возможно, придется понять, что там происходит.

В любом случае я пытаюсь написать хранимую функцию mysql, выполняющую расшифровку, потому что я хочу присоединить другую таблицу по IP-адресам (таблицу, содержащую диапазоны IP-адресов для стран) и возвращать только коды стран в запросе. .

Проблемы: я никогда не писал функцию MySQL. Как сделать цикл времени? Существуют такие функции, как pack и preg_replace, которые не встроены в MySQL. Должен ли я их как-то реализовывать?

Буду признателен за любую помощь (от подсказок до полной функции)!

Комментарии типа "MD5 не может быть расшифрован, это хэширование!" не будут оценены.

Ответы [ 2 ]

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

MD5-хэш не выполняется на IP-адресе, он, кажется, используется для добавления некоторых случайных начальных данных к шифрованию или чего-то еще.

Что касается того, как его расшифровать, зачем вам это нужно?использовать SQL?Хотя, возможно, это возможно, я подозреваю, что PHP работает намного быстрее при таком типе операций.

Используйте SQL, чтобы выбрать, скажем, 1000 пользовательских строк за раз, а затем используйте PHP, чтобы фактически связать их с каждой страной.

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

В этих функциях md5 используется только для вычисления хэша постоянной составляющей $iv_len, которая позже используется как соль для паролей.

Все остальные операции обратимы (заполнение строк, упаковка и XOR [^])

Что касается функции MySQL, я бы этого не делал.ИМХО лучшее решение - расширить таблицу пользователей столбцом country_from_ip и заполнить ее из php, расшифровав все существующие IP-адреса, получив код их страны и изменив код php, чтобы добавить эту информацию при сохранении новой записи.

Созданиеобъединение в поле, вычисленное по функции, очень скоро станет узким местом для вашего приложения

...