2012-06-30 2 views
1

Я хочу использовать Bcrypt для шифрования паролей в моих системах. Но все эти примеры являются чем-то вроде этого:Использование 512-хэша перед Bcrypt?

$password = $_POST['password']; 
$salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22); 
$hash = crypt($password, '$2a$12$'.$salt); 

Это выглядит довольно безопасно для меня, но мне было интересно, в каждом примере, никто не хэш пароля перед использованием Bcrypt.

Из-за уникальной соли, таблицы Rainbow не должны взламывать все пароли сразу. Но в случае, если хакер берет одну запись и создает радужный стол с солью этой конкретной записи, он должен иметь возможность взломать слабый пароль.

Итак, если кто-то принимает слабый пароль (скажем, «foo»), было бы безопаснее сначала использовать его SHA-512 перед использованием Bcrypt. Я прав? Или это просто выглядит безопаснее?

+1

Создание радужного стола только для одного сингла бессмысленно. – Gumbo

ответ

2

На самом деле ответ должен быть no, он не делает хэш значительно более сильным в криптографическом смысле. Как вы, вероятно, знаете, bcrypt (хотя функция для использования называется crypt) является самой хэш-функцией, а не функцией шифрования.

В bcrypt вы передадите фактор стоимости, который определяет, сколько итераций будет выполнено (как правило, сотни из них). То, что замедляет расчет хэша, что делает атаки грубой силы неосуществимыми. Используя SHA-512 раньше, добавьте еще одну итерацию.

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

Если злоумышленник имеет контроль над базой данных и кодом, дополнительный SHA-512 ничего не поможет (только одна итерация больше). Если у него есть только база данных без кода (SQL-Injection), то он узнает хэш-код bcrypt. Теперь он может использовать грубую силу с помощью bcrypt, но из-за SHA-512 нет слабых паролей. Это похоже на хэш SHA-512, чтобы пароль был взломан, поэтому словарь не нужен. Это безопасность безвестности, но будет действовать до тех пор, пока код не будет известен. Вы можете получить тот же самый эффект, добавив исправленную твердую кодированную соль (ключ), прежде чем использовать bcrypt с уникальной солью.

+1

Да, когда у злоумышленника есть база данных и код, это не имеет смысла. Но в случае, если у атакующего есть только база данных, обработка пароля (с помощью хэша или соли или что-то еще) делает систему более безопасной, потому что нет слабых паролей. Спасибо, что помогли мне! Я думаю, что я буду использовать твердую кодированную соль для защиты слабых паролей моих пользователей;) – VIDNA

1

crypt() является односторонним хешем строки, а не механизмом шифрования. Чтобы использовать хэш SHA-512, вы должны использовать функцию hash(). Bcrypt требует расширения PHP. Для хранения паролей, почему вы хотите сделать их обратимыми, а не просто их хэшированием? Это менее безопасно - если кто-то получает ваш ключ и БД, у них есть все пароли, но таблица хэшей SHA512 довольно бесполезна.

+0

Вызов 'crypt()' с параметром $ 2a 'в качестве параметра, будет фактически вычислять хэш-код bcrypt. Сам Bcrypt является хэш-функцией, Vidna не хочет шифровать пароль. – martinstoeckli

0

bcrypt уже использует соль, а то, что он делает внутренне, немного сильнее, чем SHA512. Добавление итерации SHA512 (и/или дополнительного слоя соли) поверх bcrypt не даст вам значительно более сильного результата. Если две функции взаимодействуют неверно, объединение их таким образом может фактически дать вам хеш-функцию, которая слабее.

1

Хеширование сначала не поможет. Плохой пароль - это тот, который считается более вероятным злоумышленником и помещен ранее в его списке паролей.

Bcrypt включает соль для устранения предварительно вычисленных таблиц поиска (например, таблица Rainbow). Зачем злоумышленнику строить радужный стол для одной записи? Нет, при атаке соленого пароля злоумышленник просто работает через свой упорядоченный список наиболее вероятных паролей, повторяя хэш-алгоритм, чтобы увидеть, совпадает ли он.

Как далеко он может работать через этот список, зависит от того, как долго выполняется алгоритм хеширования. Bcrypt управляет тем, что с коэффициентом «затраты» — 12 в вашем примере (это нормально, но, вероятно, минимально я использую). Дополнительный раунд SHA-512 ничего не добавляет к этому. Вы уже выполняете 4096 дорогих итераций bcrypt. Добавление 1 дешевой итерации SHA-512 незначительно.

Если вы выберете первый пароль в списке, он будет разбит на долю секунды. Если вы выберете миллиардный пароль, злоумышленник не сломает его на несколько десятилетий.

Смежные вопросы