Я пытаюсь сгенерировать хэши иглобрюха, и мне интересно, достаточно ли безопасно полагаться на 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)));
}
Кроме того, как указано в заголовке и коде выше, я не реализую свой собственный алгоритм хеширования.
Использование расширения 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)));
}
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)));
}