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

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

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

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

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

Наприклад, ви хешуєте і зберігаєте свої паролі в MD5. Якщо ваша база буде вкрадена — зловмисник досить просто відновить більшість вихідних паролів, використовуючи заздалегідь підготовлені райдужні таблиці. Якщо ж ми «посолимо» пароль, тобто з'єднаємо рядок з 10-20 випадковими символами з паролем і вже від цього рядка знайдемо MD5, — стандартні таблиці не будуть працювати, так як вони не розраховані на пошук такого довгого рядка.

Приклад створення хеш з сіллю на PHP:

  $password = 'password';            // Сам пароль
  $hash1 = md5($password);           // Хешируем первоначальный пароль
  $salt = 'sflprt49fhi2';            // Соль
  $saltedHash = md5($hash1 . $salt); // Складываем старый хеш с солью и пропускаем через функцию md5()

В даному прикладі сіль є детермінованим рядком, в реальних проектах слід застосовувати тільки динамічну сіль. Приклад використання функції crypt на мові PHP:

$hash = crypt('password');              // crypt генерирует соль и хеширует, используя алгоритм по умолчанию

if (crypt($password, $hash) == $hash) { // crypt извлекает соль из существующего хеша и хеширует входящий пароль с её использованием
   // Пароль верен
}

Проблеми, пов'язані з сіллю і надійністю паролів[ред.ред. код]

При несанкціонованому доступі до бази даних або вдалою 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].

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

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

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