Это перебор? Динамическое солевое шифрование для шифрования паролей Whirlpool
Я думаю, что, возможно, сгенерировал немного избыточной соли, когда дело доходит до шифрования паролей в джакузи.
Это то, что делает код генерации соли, шаг за шагом
Генерируется псевдослучайная строка длиной 10, которая имеет следующие возможные значения:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Действительно случайное число от -2 до 123 генерируется атмосферным шумом
- Эта псевдослучайная строка и полностью случайное число перемешиваются вместе с меткой времени Unix.
- Эта предварительная соль затем шифруется с помощью md5.
Это просто поколение соли, у меня тоже все это зашифровано в джакузи
hash( 'whirlpool',$salt.$password);
Есть ли уязвимость в моем коде? Должен ли я md5 хешировать значения до их объединения или после?
Вот мой код, чтобы проверить...
<?php
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, strlen($characters) - 1)];
}
return $randomString;
}
function get_true_random_number($min = 1, $max = 100) {
$max = ((int) $max >= 1) ? (int) $max : 100;
$min = ((int) $min < $max) ? (int) $min : 1;
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_ENCODING => '',
CURLOPT_USERAGENT => 'PHP',
CURLOPT_AUTOREFERER => true,
CURLOPT_CONNECTTIMEOUT => 120,
CURLOPT_TIMEOUT => 120,
CURLOPT_MAXREDIRS => 10,
);
$ch = curl_init('http://www.random.org/integers/?num=1&min='
. $min . '&max=' . $max . '&col=1&base=10&format=plain&rnd=new');
curl_setopt_array($ch, $options);
$content = curl_exec($ch);
curl_close($ch);
if(is_numeric($content)) {
return trim($content);
} else {
return rand(-10,127); //INCASE RANDOM.ORG returns a server busy error
}
}
function generateSalt() {
$string = generateRandomString(10);
$int = get_true_random_number(-2,123);
$shuffled_mixture = str_shuffle(Time().$int.$string);
return $salt = md5($shuffled_mixture);
}
echo generateSalt();
?>
Кроме того, как долго должна быть соль? Лично я не думаю, что хэширование, это другие типы персонажей, имеет значение настолько просто, потому что никто не делает грубую соль, я не думаю. Это все! Заранее спасибо. Кроме того, любой лучший или более эффективный метод будет полезен.
2 ответа
Общее руководство по криптографии: никогда не пишите свой собственный криптограф! Это включает в себя создание собственных алгоритмов и реализацию публично проверенных систем. Это слишком сложно, чтобы получить права (даже для экспертов).
Начиная с PHP 5.5, существует очень простой и надежный API, который вы должны использовать для хеширования паролей: password_hash () и password_verify()
Теперь о вашей реализации и алгоритме:
Вы беспокоитесь о неправильных аспектах вашего алгоритма хеширования паролей. Соль, которую вы используете, не должна включать в себя сверхвысокие значения энтропии, и даже эти значения можно собирать гораздо более простым способом (например, если вы работаете в Linux, прочитайте 32 байта из /dev/urandom
).
Вместо этого вам следует беспокоиться о том, насколько трудно взломать пароль, учитывая соль и хеш (сценарий взлома базы данных). Это фактически означает хеширование всех вероятных паролей с сохраненной солью и сравнение его с сохраненным ссылочным хешем. Чтобы замедлить злоумышленника, вы хотите использовать медленную хеш-функцию, чтобы предотвратить множество сравнений паролей. Примером может быть хеширование полученного хеша снова и снова (несколько тысяч раз).
Соль защищает от атак радужных таблиц, где огромные предварительно вычисленные базы данных могут запрашивать исходный хеш. Вы (успешно) предотвращаете этот вектор атаки, рандомизируя хеш-функцию через соль.
Мигель Ибарра Ромеро предлагает отличную статью по этому вопросу:
Риски и проблемы хеширования паролей
Он утверждает, что соли должны быть длиной 64 символа, чтобы предотвратить атаки грубой силы.
С точки зрения реализации: я настоятельно рекомендую не использовать источник истинных случайных чисел, над которым у вас нет физического контроля. Получение случайных чисел с чужого веб-сайта, каким бы удобным оно ни было, не является надежной практикой безопасности. Вы не знаете с криптографической надежностью, откуда взялись эти цифры, как они были получены, насколько они предвзяты, и есть ли записи о том, что вы их получили.