Сіль (криптографія)
Сіль (також модифікатор) — рядок даних, який передається геш-функції разом з паролем.
Головним чином використовується для захисту від перебору за словником і атак з використанням райдужних таблиць, а також приховування однакових паролів. Однак, сіль не може захистити від повного перебору кожного окремого пароля.
Сіль використовується для захисту паролів при їх зберіганні. Раніше паролі зберігались у відкритому вигляді на серверах в файлах або БД, що не забезпечувало їх захист в разі несанкційного доступу до серверу або у випадках викрадення файлу. Для протидії таким загрозам з часом створювали додаткові методи захисту паролів при їх зберігання. Сіль - одне з таких методів.
Сіль генеруються випадковим чином для кожного пароля. Сіль та пароль об'єднують і ця строка перетворюється за допомогою криптографічної хеш-функції в геш, який і зберігається разом із сіллю. Це дозволяє перевірити пароль без його збереження.
Приклад використання[ред. | ред. код]
Наприклад, ви хешуєте і зберігаєте свої паролі в 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[ред. | ред. код]
У більшості 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.
- ↑ 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.
|