Сіль (криптографія)
Сіль (також модифікатор) — рядок даних, який передається геш-функції разом з паролем.
Головним чином використовується для захисту від перебору за словником і атак з використанням райдужних таблиць, а також приховування однакових паролів. Однак, сіль не може захистити від повного перебору кожного окремого пароля.
Сіль використовується для захисту паролів при їх зберіганні. Раніше паролі зберігались у відкритому вигляді на серверах в файлах або БД, що не забезпечувало їх захист у разі несанкціоноваго доступу до серверу або у випадках викрадення файлу. Для протидії таким загрозам з часом створювали додаткові методи захисту паролів при їх зберігання. Сіль - один з таких методів.
Сіль генеруються випадковим чином для кожного пароля. Сіль та пароль об'єднують і цей рядок перетворюється за допомогою криптографічної геш-функції в геш, який і зберігається разом із сіллю. Це дозволяє перевірити пароль без його збереження.
Наприклад, ви хешуєте і зберігаєте свої паролі в MD5. Якщо ваша база буде вкрадена — зловмисник досить просто відновить більшість вихідних паролів, використовуючи заздалегідь підготовлені веселкові таблиці. Якщо ж ми «посолимо» пароль, тобто з'єднаємо рядок з 10-20 випадковими символами з паролем і вже від цього рядка знайдемо MD5, — стандартні таблиці не будуть працювати, так як вони не розраховані на пошук такого довгого рядка.
Приклад створення хешу з сіллю на PHP:
$password = 'password'; // Безпосередньо пароль
$hash1 = md5($password); // Хешуємо первісний пароль
$salt = 'sflprt49fhi2'; // Сіль
$saltedHash = md5($hash1 . $salt); // Додаємо до гешу первісного паролю сіль, і це об'єднання знов хешуємо
В наведеному прикладі сіль задана константою, але в реальних проектах потрібно її генерувати кожного разу як випадкове число.
Приклад використання функції crypt на мові PHP, зберігання гешу пароля та його солі:
$salt = rand();
$hashed_password = crypt('password', $salt); // crypt генерує сіль і хешує, використовуючи алгоритм за умовчанням
// зберігаємо $hashed_password та $salt
Перевірка вказаного пароля по його гешу та солі:
if ( $hashed_password == crypt($user_input, $salt) ) {
echo "Пароль правильний!";
}
Приклад результатів застосування солі із хешуванням SHA256.
Для початку у нас є дані Користувачів з певними іменами та Паролями:
Користувач | Пароль |
---|---|
user1 | password123 |
user2 | password123 |
Код додає сіль до паролю, створюючи більш унікальний хеш:
Користувач | Значення солі | Рядок що хешується | Хешоване значення = SHA256 (Пароль + Значення солі) |
---|---|---|---|
user1 | E1F53135E559C253 | password123E1F53135E559C253 | 72AE25495A7981C40622D49F9A52E4F1565C90F048F59027BD9C8C8900D5C3D8 |
user2 | 84B03D034B409D4E | password12384B03D034B409D4E | B4B6603ABC670967E99C7E7F1389E40CD16E78AD38EB1468EC2AA1E62B8BED3A |
Якщо значення паролів для різних користувачів однакові — хеш рядки для різних користувачів теж є однаковими:
Користувач | Рядок що хешується | Хешоване значення = SHA256 |
---|---|---|
user1 | password123 | 57DB1253B68B6802B59A969F750FA32B60CB5CC8A3CB19B87DAC28F541DC4E2A |
user2 | password123 | 57DB1253B68B6802B59A969F750FA32B60CB5CC8A3CB19B87DAC28F541DC4E2A |
При несанкціонованому доступі до бази даних або вдалій SQL-ін'єкції зловмисник отримає дані доступу одного або декількох користувачів. Якби паролі зберігалися в первісному вигляді, зловмисник міг би спробувати використовувати їх для доступу до інших ресурсів (таким чином відбувається захист користувача сайту від злому профілів в інших системах — у нього буде час на зміну паролів, поки зловмисник зайнятий підбором.)
Існує безліч функцій для створення хешів як складних, так і простих, до того ж кожен може написати свою реалізацію. Однак, все зводиться до того, як швидко буде отримано доступ до використання такої ж хешуючої функції і генерування райдужної таблиці.
Одна з найважливіших місій солі — зробити різними хеши паролів в тому випадку, якщо двоє вказали однаковий пароль, тим самим ускладнивши перебір. Це ж актуально за умови, що одній людині дозволено мати кілька профілів.
У більшості UNIX-систем в якості односторонньої функції використовується системна бібліотека crypt(3). Спочатку ця бібліотека використовувала хеш-функцію на базі алгоритму DES. При цьому пароль був обмежений 8 символами (по 7 біт на символ, тобто 56 біт), і використовувалася 12-бітна сіль[1].
1994 року Поуль-Геннінґ Камп на основі MD5 створив новий алгоритм хешування паролів, який дозволяв використовувати паролі будь-якої довжини і використовував тисячу ітерацій MD5[2][3]. Результатом роботи функції став рядок, що містить мітку алгоритму хешування (версію), сіль і власне хеш.
В ті часи, час обчислення такого хешу виглядав достатнім для ефективного протистояння знаходженню пароля повним перебором. Однак по мірі зростання обчислювальних потужностей час знаходження MD5 сильно зменшився. Це призвело до появи в crypt обчислювально більш складних алгоритмів та управління числом ітерацій[4].
Зараз бібліотека підтримує кілька хеш-функцій на базі алгоритмів: MD5, SHA-256, SHA-512, Blowfish (у деяких дистрибутивах Linux, OpenBSD і деяких інших UNIX-подібних системах)[5]. Результатом роботи функції є рядок, що містить мітку алгоритму хешування, сіль, власне хеш і, опціонально, інші дані (наприклад, число раундів хеш-функції).
У 2012 році Poul-Henning Kamp закликав повністю відмовитися від створеного ним алгоритму md5crypt, який не забезпечує, в сучасних умовах, відчутного збільшення часу обчислення хешу, а як наслідок не захищає від повного перебору[6].
Використання однієї і тієї ж солі для всіх паролів небезпечно, оскільки попередньо обчислена таблиця, яка просто враховує сіль, зробить сіль непотрібною.
Створення попередньо обчислених таблиць для баз даних з унікальними солями для кожного пароля неможливе через обчислювальні витрати. Але якщо для всіх записів використовується одна єдина сіль, створення такої таблиці (в якій враховується сіль) стає практичною алк і одночасно можливо, легкою здобиччю при атаках.[7]
Оскільки повторне використання солі може призвести до того, що користувачі з тим самим паролем отримають той самий хеш, злом одного хеша може призвести до компрометації інших паролів.
Якщо сіль занадто коротка, зловмисник може попередньо обчислити таблицю всіх можливих солей, доданих до кожного ймовірного пароля. Використання довгої солі гарантує, що така таблиця буде надзвичайно великою.[8]
- ↑ Проект OpenNet: MAN crypt (3) Библиотечные вызовы (FreeBSD и Linux)
- ↑ FreeBSD CVS log for src/lib/libcrypt/crypt.c
- ↑ Niels Provos, David Mazières (June 1999). A Future-Adaptable Password Scheme. Paper - 1999 USENIX Annual Technical Conference, June 6-11, 1999, Monterey, California, USA. Архів оригіналу за 9 серпня 2012. Процитовано 5 квітня 2018.
- ↑ Unix crypt with SHA-256/512
- ↑ crypt(3) — Linux manual page
- ↑ Md5crypt Password scrambler is no longer considered safe by author. Архів оригіналу за 17 березня 2018. Процитовано 5 квітня 2018. [Архівовано 2018-03-17 у Wayback Machine.]
- ↑ Secure Salted Password Hashing - How to do it Properly. crackstation.net. Процитовано 19 березня 2021.
- ↑ Secure Salted Password Hashing - How to do it Properly:salt.
- Robert Morris, Ken Thompson. Password security: a case history. — ACM New York, NY, USA, 1979. — Т. 22, № 11. — С. 594—597.
- B. Kaliski (September 2000). PKCS #5: Password-Based Cryptography Specification Version 2.0 (англ.). Архів оригіналу за 2 липня 2012. Процитовано 13 червня 2012.