Хранение bcrypt хэшей - PullRequest
       40

Хранение bcrypt хэшей

2 голосов
/ 08 сентября 2011

Согласно документации PHP, соль bcrypt состоит из

"$ 2a $", двухзначный параметр стоимости, "$" и 22 цифры из алфавита "./0-9A-Za-z"

Итак, если я использую функцию crypt () для хеширования своих паролей, в результате получим первые 7 символов ($ 2a $ 10 $, если 10 - параметр стоимости) как часть соли - и, согласно все примеры, которые мне удалось найти в Интернете, этот полный вывод записан в БД.

Мне интересно, какой смысл хранить эти первые символы вместе с остальной солью и зашифрованными данными. Их значение мне совершенно ясно, но я не могу понять, почему такая информация должна быть написана вместе с остальной частью хэша. Разве они не «просто» информация об алгоритме и адаптивной стоимости вычислений? Так какая польза от хранения такой информации, связанной с приложением? И (даже если это может звучать по-детски), зачем раскрывать их злоумышленнику, который может в конечном итоге захватить мою базу данных?

1 Ответ

11 голосов
/ 08 сентября 2011

Причина в том, как работает крипта. Он спроектирован так, что вы можете сделать следующее

if ($hashedPassword == crypt($rawPassword, $hashedPassword)) {
    //Verified
}

Так что, сохраняя все, вам не нужно каждый раз воссоздавать солонку ...

И смысл соли не должен быть секретом. На самом деле, это не значит быть секретным. Это предназначено, чтобы помешать радужным столам. помните, что если они смогут захватить вашу базу данных, высоки шансы, что они смогут получить и другие вещи, поэтому добавление соли в другое место на самом деле не даст вам много.

Кроме того, соль не сильно поможет. BCrypt разработан, чтобы быть CPU-Hard, что означает, что грубое принуждение (даже при знании соли) нецелесообразно. Вот почему у вас есть параметр cost . Так что не беспокойтесь о «сокрытии» соли. Просто храните его рядом с паролем, и все будет в порядке ...

Не говоря уже о том, что произойдет, если в будущем вы захотите настроить свой алгоритм? Например, допустим, вы хотите увеличить параметр стоимости за счет более качественного оборудования. Если вы не сохранили эту информацию с паролем, все ваши сохраненные пароли станут недействительными. Таким образом, каждый сохраненный пароль имеет всю информацию, необходимую для его проверки. Таким образом, вы можете проверить действительный вход в систему, если хэш является текущим значением по умолчанию, а если нет, перефразировать и обновить базу данных новой. Это предотвращает проблемы, связанные с обновлением и улучшением методов хеширования ...

...