Как bcrypt может иметь встроенные соли?
статья кода Хейла "Как безопасно хранить пароль" утверждает, что:
bcrypt имеет встроенные соли для предотвращения атак радужных таблиц.
Он цитирует этой статье, что говорит о том, что в реализации OpenBSD bcrypt:
OpenBSD генерирует 128-битную соль bcrypt из arcfour
(arc4random (3)) ключевой поток, засеянный случайными данными ядра
собирает от прибора синхронизации.
Я не понимаю, как это может работать. В моем представлении о соли:
- он должен быть разным для каждого сохраненного пароля, так что отдельная таблица радуги должна быть сгенерирована для каждого
- он должен быть сохранен где-то, чтобы его можно было повторить: когда пользователь пытается войти в систему, мы берем их пароль, повторяем ту же процедуру соли и хэша, которую мы делали, когда мы первоначально сохраняли свой пароль, и сравните
когда я использую Devise (менеджер входа в систему Rails) с bcrypt, в базе данных нет столбца соли, поэтому я смущен. Если соль случайна и нигде не хранится, как мы можем надежно повторить процесс хэширования?
короче, как bcrypt может иметь встроенные соли?
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сама утилита, похоже, не поддерживает список солей. Скорее, соли генерируются случайным образом и добавляются к выходу функции, чтобы они запоминались позже (согласно реализация Javabcrypt). Другими словами, " хэш " генерируетсяbcryptне просто хэш. Скорее это хэш и соли объединяются.
Comments