Нужно ли Salt and Hash случайно сгенерированный токен?
Я использую библиотеку аутентификации Адама Гриффитса для CodeIgniter и настраиваю пользовательскую модель.
Я наткнулся на функцию генерации, которую он использует для генерации токенов.
Его предпочтительный подход - ссылаться на значение из random.org, но я счел это излишним. Я использую его альтернативный метод случайного генерирования строки длиной 20 символов:
$length = 20;
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$token = '';
for ($i = 0; $i < $length; $i++) {
$token .= $characters[mt_rand(0, strlen($characters)-1)];
}
Затем он хеширует этот токен с помощью соли (я прочесываю код из разных функций)
sha1($this->CI->config->item('encryption_key').$str);
Мне было интересно, есть ли какая-либо причина для запуска токена через соленый хеш?
Я читал, что просто случайное создание строк было наивным способом создания случайных паролей, но нужен ли sh1 хэш и соль?
Примечание. Я получил ключ шифрования от https://www.grc.com/passwords.htm (63 случайных буквенно-цифровых символа)
2 ответа
Соление хеша используется для уменьшения вероятности коллизии и обеспечения того, что хеш не может быть найден в базе данных (как это) - если все используют md5()
для хранения их паролей файл / базу паролей можно было бы "дешифровать", посмотрев значение пароля в md5.
Используя соль, в хеш добавляется неизвестный элемент, что означает, что должен быть также известен код для генерации соли, чтобы попытаться перебрать хэш. В контексте генерации случайного пароля я не вижу смысла засолять хэш, так как данные пароля в любом случае случайны.
Основная причина засоления хеш-функций заключается в усложнении атак по словарю. А соление избегает обнаружения одинаковых паролей, так как они производят один и тот же хеш.
Другое использование хеш-функций в генераторах псевдослучайных чисел - где ваш код пытается это сделать.
Добиться истинной случайности нелегко, и генерация псевдослучайных данных может быть сложной. Код, который вы объяснили, похоже, пытается получить "лучшую" случайность от random.org, и его резервное псевдогенерация пытается сделать правильную вещь.