Как bcrypt может иметь встроенные соли?



статья кода Хейла "Как безопасно хранить пароль" утверждает, что:




bcrypt имеет встроенные соли для предотвращения атак радужных таблиц.




Он цитирует этой статье, что говорит о том, что в реализации OpenBSD bcrypt:




OpenBSD генерирует 128-битную соль bcrypt из arcfour
(arc4random (3)) ключевой поток, засеянный случайными данными ядра
собирает от прибора синхронизации.




Я не понимаю, как это может работать. В моем представлении о соли:




  • он должен быть разным для каждого сохраненного пароля, так что отдельная таблица радуги должна быть сгенерирована для каждого

  • он должен быть сохранен где-то, чтобы его можно было повторить: когда пользователь пытается войти в систему, мы берем их пароль, повторяем ту же процедуру соли и хэша, которую мы делали, когда мы первоначально сохраняли свой пароль, и сравните


когда я использую Devise (менеджер входа в систему Rails) с bcrypt, в базе данных нет столбца соли, поэтому я смущен. Если соль случайна и нигде не хранится, как мы можем надежно повторить процесс хэширования?



короче, как bcrypt может иметь встроенные соли?

966   2  

2 ответов:

Это bcrypt:

генерировать случайные соли. Фактор "стоимость" был предварительно настроен. Соберите пароль.

выведите ключ шифрования из пароля, используя коэффициент соли и стоимости. Используйте его для шифрования известной строки. магазине стоимостью, соль, и зашифрованный текст. Поскольку эти три элемента имеют известную длину, их легко объединить и хранить в одном поле, но можно разделить их на части позже.

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

Bcrypt работает очень похожим образом на более традиционные схемы, основанные на алгоритмах, таких как PBKDF2. Основное отличие заключается в использовании производного ключа для шифрования известного простого текста; другие схемы (разумно) предположим, что функция вывода ключа необратима, и хранить производный ключ непосредственно.


хранится в базе данных, a bcrypt "хэш" может выглядеть примерно так:

$2a$10$vI8aWBnW3fID.ZQ4 / zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa

это на самом деле три поля, разделенные "$":

  • 2a определяет bcrypt версия алгоритма, который был использован.
  • 10 - коэффициент затрат ; 210 используются итерации функции вывода ключа (что, кстати, недостаточно. Я бы рекомендовал стоимость 12 или больше.)
  • vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa это соль и зашифрованный текст, сцепленные и закодированные в модифицированной базе-64. Первые 22 символа декодируются в 16-байтовое значение для соли. Остальные символы являются зашифрованным текстом, который будет сравниваться для аутентификации.

этот пример взят из документация для Рубина кода Хейла реализация.

Я считаю, что эта фраза должна была быть сформулирована следующим образом:

осуществляется и соли встроенный в сгенерированный хэш для предотвращения атак "радужная" таблица.

The bcrypt сама утилита, похоже, не поддерживает список солей. Скорее, соли генерируются случайным образом и добавляются к выходу функции, чтобы они запоминались позже (согласно реализация Java bcrypt). Другими словами, " хэш " генерируется bcrypt не просто хэш. Скорее это хэш и соли объединяются.

Comments

    Ничего не найдено.