Сіль — унікальне випадкове значення, яке додають до кожного пароля перед хешуванням, щоб однакові паролі давали різні хеші.
Як працює сіль
Системи не повинні зберігати самі паролі — лише їхні хеші. Без солі той самий пароль завжди дає той самий хеш: зловмисник порівнює викрадені хеші з величезними заздалегідь обчисленими таблицями (райдужними таблицями) і одразу бачить, у яких користувачів однакові паролі. Із сіллю система генерує випадкове значення для кожного користувача, поєднує його з паролем і зберігає сіль поруч з отриманим хешем:
hash("password123" + "Q3v9...")— в одного користувача,hash("password123" + "Lm81...")— в іншого, і результати зовсім різні.
Сіль не є секретом. Її завдання — зробити кожен хеш унікальним, щоб зламувати їх доводилося поодинці. Рекомендації NIST вимагають сіль не коротшу за 32 біти; на практиці бібліотеки використовують 16 байт. Перець (pepper) — інше поняття: секретне значення, яке зберігають окремо від бази, наприклад в апаратному модулі безпеки.
Чим сіль важлива для безпеки
Сама сіль не захищає слабкі паролі від перебору: сучасні відеокарти перевіряють мільярди швидких хешів на кшталт MD5 чи SHA-256 за секунду. Тому сіль треба поєднувати з повільною, вимогливою до пам’яті функцією хешування паролів. У багатьох витоках розкривалися паролі без солі або зі слабким хешуванням, і їх зламували за лічені дні.
Рекомендації
- Використовуйте спеціальні алгоритми хешування паролів: Argon2id, scrypt, bcrypt або PBKDF2 з великою кількістю ітерацій — вони самі генерують сіль.
- Ніколи не зберігайте паролі у вигляді простого MD5, SHA-1 чи SHA-256.
- Генеруйте сіль криптографічно стійким генератором, унікальну для кожного пароля.
- Користувачам — довгі унікальні паролі та менеджер паролів: сіль не врятує «123456».