Соль (salt)
Соль — это случайная строка, которую добавляют к паролю перед хэшированием.
Не секрет, не ключ, не токен. Это просто случайные байты, хранящиеся рядом с хэшем пароля.
Зачем нужна соль
1. Защита от одинаковых хэшей
Без соли:
- Пользователь
user1с паролемqwerty - Пользователь
user2с тем же паролемqwerty
→ у обоих хэш будет одинаковым!
Хакер по хэшу узнаёт, что у этих двух пользователей один и тот же пароль. Плохо.
С солью:
password = 'qwerty'
salt = 'X7#wZ'
hash = hash_fn('qwertyX7#wZ')
→ у каждого пользователя свой хэш, даже если пароль одинаковый.
2. Устойчивость к rainbow tables
Rainbow table — это заранее посчитанные хэши популярных паролей.
Пример:
| Пароль | MD5 хэш |
|---|---|
| 123456 | e10adc3949ba59abbe56e057 |
| qwerty | d8578edf8458ce06fbc5bb76 |
Если твой пароль в этой таблице — ты скомпрометирован.
Соль делает эту таблицу бесполезной:
хэш считается от пароль + соль, а не от чистого пароля.
Где соль хранится
Обычно — прямо в базе рядом с хэшем:
| user | salt | password_hash |
|---|---|---|
| anna | 4f8@Kx | hash('mypassword4f8@Kx') |
Когда и как она используется
Регистрация
- Пользователь вводит пароль.
- Генерируется соль.
- Считается хэш от
пароль + соль. - Хэш и соль сохраняются.
Логин
- Пользователь вводит пароль.
- Сервер находит его соль.
- Считается
hash(пароль + соль)— сравнивается с сохранённым хэшем.
Почему одной соли недостаточно
Поэтому дополнительно применяют:
- pepper — секрет, который не хранится в базе, а в коде/переменной окружения;
- специальные функции хэширования:
bcrypt,scrypt,argon2— они медленные и устойчивые к брутфорсу.
Вывод
| Термин | Описание |
|---|---|
| Соль (salt) | случайная строка для уникализации хэша пароля |
| Защищает от | брутфорса, rainbow tables, сравнения хэшей |
| Хранится | вместе с хэшем в БД |
| Используется в | bcrypt, argon2, scrypt, PBKDF2 и других схемах |