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

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая 77.37.159.3 (обсуждение) в 21:36, 20 февраля 2017 (Проблемы связанные с солью и надёжностью паролей). Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску

Соль (также модификатор) — строка данных, которая передаётся хеш-функции вместе с паролем. Используется для удлинения строки пароля, чтобы увеличить сложность взлома.

Используется для борьбы с восстановлением паролей за один проход полного перебора (брутфорс) или с помощью предварительно построенных радужных таблиц. Соль не может защитить от брутфорса каждого отдельного пароля.

Пример использования

Например, вы хешируете и храните свои пароли в 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 году Poul-Henning Kamp на базе MD5 создал новый алгоритм хеширования паролей, который позволял использовать пароли любой длины и использовал тысячу итераций MD5[2][3]. Результатом работы функции стала строка, содержащая метку алгоритма хеширования (версию), соль и собственно хеш.

По тем временам время вычисления такого хеша выглядело достаточным для эффективного противостояния нахождению пароля полным перебором. Однако по мере роста вычислительных способностей время нахождения MD5 сильно упало. Это привело к появлению в crypt вычислительно более сложных алгоритмов и управления числом итераций[4].

Сейчас библиотека поддерживает несколько хеш-функций на базе алгоритмов: md5, sha-256, sha-512, Blowfish (в некоторых дистрибутивах Linux, OpenBSD и некоторых других UNIX-подобных системах)[5]. Результатом работы функции является строка, содержащая метку алгоритма хеширования, соль, собственно хеш и, опционально, другие данные (например, число раундов хеш-функции).

В 2012 году Poul-Henning Kamp призвал полностью отказаться от созданного им алгоритма md5crypt, как не обеспечивающего в современных условиях ощутимого увеличения времени вычисления хеша, а значит, и не защищающего от полного перебора[6].

Литература

Примечания

См. также