Как создать хеш md5, поскольку функция crypt генерирует соль md5, используя функцию md5, а не функцию crypt? - PullRequest
3 голосов
/ 15 февраля 2011

Я предпочитаю использовать функцию crypt в php для шифрования пароля и других односторонних требований шифрования. Потому что я могу использовать любой поддерживаемый алгоритм шифрования, изменив соль, и есть несколько других преимуществ. Обычно я не пользуюсь солью, и она требует случайной соли MD5. Я сохраняю эту строку шифрования в качестве хэша пароля в базе данных, и во время аутентификации пользователя я использую ее как соль для функции crypt. Работает нормально в php. Но когда для создания хеша нужен какой-либо другой язык программирования, а я использую функцию crypt в части php функции, мы столкнулись с проблемой.

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

1 Ответ

0 голосов
/ 15 февраля 2011

Вот код в Java , который реализует ту же функцию. Это может помочь вам сделать то же самое на других языках.

Для PHP вы можете посмотреть этот код:

    echo 'MD5:          ' . crypt('mypassword', '$1$somesalt$') . "\n";
    echo 'MD5:          ' . mycrypt('mypassword', 'somesalt') . "\n";

    function to64($s, $n)
    {
        $i64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        $r = '';
        while (--$n >= 0) {
            $ss = $s & 0x3f;
            $r .= $i64[$s & 0x3f];
            $s >>= 6;
         }
        return $r;
    }

    function mycrypt($v, $s) {
            $m = hash_init("md5");
            hash_update($m, $v);
            hash_update($m, '$1$');
            hash_update($m, $s);

            $m1 = hash_init("md5");
            hash_update($m1, $v);
            hash_update($m1, $s);
            hash_update($m1, $v);
            $final = hash_final($m1, true);
            for ($pl = strlen($v); $pl>0; $pl-=16) {
                    hash_update($m, substr($final, 0, $pl > 16? 16:$pl));
            }
            $final = "\0";
            for($i=strlen($v);$i!=0;$i>>=1) {
                    if (($i & 1) != 0) {
                            hash_update($m, $final);
                    } else {
                            hash_update($m, $v[0]);
                   }
            }
            $final = hash_final($m, true);
            for($i=0;$i<1000;$i++) {
                $m1 = hash_init("md5");

                if(($i&1)) {
                    hash_update($m1, $v);
                } else {
                    hash_update($m1, $final);
                }
                if(($i%3)) {
                    hash_update($m1, $s);
                }
                if(($i%7)) {
                    hash_update($m1, $v);
                }
                if(($i&1)) {
                    hash_update($m1, $final);
                } else {
                    hash_update($m1, $v);
                }
                $final = hash_final($m1, true);
            }
            $l = '$1$'.$s.'$';
            $l .= to64(ord($final[ 0])<<16 | (ord($final[ 6])<<8) | ord($final[12]), 4);
            $l .= to64(ord($final[ 1])<<16 | (ord($final[ 7])<<8) | ord($final[13]), 4);
            $l .= to64(ord($final[ 2])<<16 | (ord($final[ 8])<<8) | ord($final[14]), 4);
            $l .= to64(ord($final[ 3])<<16 | (ord($final[ 9])<<8) | ord($final[15]), 4);
            $l .= to64(ord($final[ 4])<<16 | (ord($final[10])<<8) | ord($final[ 5]), 4);
            $l .= to64(ord($final[11]), 2);

            return $l;
    }
...