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

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

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

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


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

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

Література ред.