Зачем паролю добавляют два разных секрета

Сервис обычно не хранит пароль в исходном виде. Вместо него в базе лежит результат специального вычисления — хеш, который трудно обратить обратно. Когда пользователь входит, система вычисляет хеш введённого пароля и сравнивает его с сохранённым.

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

Перец — отдельный барьер

«Перец» — ещё одно секретное значение, которое система добавляет при вычислении хеша. В отличие от соли, оно может быть общим для многих записей и не хранится в самой базе. Его держат, например, в защищённой конфигурации приложения или отдельном хранилище секретов.

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

Цена дополнительной защиты

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

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