Сіль (криптографія)

Сіль (також модифікатор) — рядок даних, який передається геш-функції разом з паролем.

Головним чином використовується для захисту від перебору за словником і атак з використанням райдужних таблиць, а також приховування однакових паролів. Однак, сіль не може захистити від повного перебору кожного окремого пароля.

Сіль використовується для захисту паролів при їх зберіганні. Раніше паролі зберігались у відкритому вигляді на серверах в файлах або БД, що не забезпечувало їх захист в разі несанкційного доступу до серверу або у випадках викрадення файлу. Для протидії таким загрозам з часом створювали додаткові методи захисту паролів при їх зберігання. Сіль - одне з таких методів.

Сіль генеруються випадковим чином для кожного пароля. Сіль та пароль об'єднують і ця строка перетворюється за допомогою криптографічної хеш-функції в геш, який і зберігається разом із сіллю. Це дозволяє перевірити пароль без його збереження.


Приклад використання[ред. | ред. код]

Наприклад, ви хешуєте і зберігаєте свої паролі в 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]

Дивись також[ред. | ред. код]

Примітки[ред. | ред. код]

  1. Проект OpenNet: MAN crypt (3) Библиотечные вызовы (FreeBSD и Linux)
  2. FreeBSD CVS log for src/lib/libcrypt/crypt.c
  3. 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.
  4. Unix crypt with SHA-256/512
  5. crypt(3) — Linux manual page
  6. Md5crypt Password scrambler is no longer considered safe by author. Архів оригіналу за 17 березня 2018. Процитовано 5 квітня 2018.
  7. Secure Salted Password Hashing - How to do it Properly. crackstation.net. Процитовано 19 березня 2021.
  8. Secure Salted Password Hashing - How to do it Properly:salt.

Література[ред. | ред. код]