Безопасность генерации хеш-солей с использованием PHP's mt_rand()?

Я пытаюсь сгенерировать хэши иглобрюха, и мне интересно, достаточно ли безопасно полагаться на mt_rand()для генерации моих солей для меня?

function blowfish($string, $salt = NULL, $iterations = '08')
{
    if( ! $salt)
    {
        $seed = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        for ($i = 0; $i < 22; $i++)
        {
            $salt.= $seed{mt_rand(0, 63)};
        }
        $salt = '$2a$'. $iterations. '$'. $salt;
    }

    return crypt($string, $salt);
}

Символ $seed, указанный выше, является разрешенным 64-символьным иглобрюхом-сольным алфавитом . Я планирую использовать это для создания и сравнения паролей.

$password = 'my^$%#password';
$hash = blowfish($password);

if($hash = blowfish($password, $hash))
{
    print "Matches\n";
    print $hash. "\n";
}

Изменить

Я так и не понял, но то, что говорит @zerkms, правда. Соль предназначена только для предотвращения многоразовых предварительно вычисленных атак, поскольку соль известна в тот же момент, когда они имеют доступ к хешу. Таким образом, целью является не не-обратимая соль, -, а случайная соль.

Итак, в этом что-то не так?

function blowfish($string, $salt = NULL, $iterations = '12')
{
    return crypt($string, $salt ?: "$2a\$$iterations$". md5(uniqid('', true)));
}

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

Обновление 2

Использование расширения mcrypt, если оно загружено, приводит к следующему, что на самом деле быстрее, вероятно, потому чтоuniqid(u)спит или что-то в этом роде.

function blowfish($string, $salt = NULL, $iterations = '12')
{
    return crypt($string, $salt ?: "$2a\$$iterations$". base64_encode(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)));
}

Обновление 3

base64_encode работает быстрее, чем md5 -, но содержит недопустимые символы иглобрюха, такие как +. Так что теперь поменял на md5.

function blowfish($string, $salt = NULL, $iterations = '12')
{
    return crypt($string, $salt ?: "$2a\$$iterations$". md5(mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)));
}

6
задан Xeoncross 17 April 2012 в 15:55
поделиться