Перейти до вмісту

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

Матеріал з Вікіпедії — вільної енциклопедії.

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

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

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

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

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

[ред. | ред. код]

Наприклад, ви гешуєте і зберігаєте свої паролі в 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 (Червень 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. [Архівовано 2018-03-17 у Wayback Machine.]
  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.

Література

[ред. | ред. код]
  • Robert Morris, Ken Thompson. Password security: a case history. — ACM New York, NY, USA, 1979. — Т. 22, № 11. — С. 594—597.
  • B. Kaliski (Вересень 2000). PKCS #5: Password-Based Cryptography Specification Version 2.0 (англ.). Архів оригіналу за 2 липня 2012. Процитовано 13 червня 2012.