Соль (криптография) | это... Что такое Соль (криптография)? (original) (raw)

У этого термина существуют и другие значения, см. Соль (значения).

Question book-4.svg В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники.Эта отметка установлена 11 июня 2012.

В криптографии соль — это строка случайных данных, которая подается на вход хеш-функции вместе с исходными данными. Основная задача соли — удлинение строки пароля, что значительно осложняет восстановление исходных паролей с помощью предварительно построенных радужных таблиц. При этом, соль не защищает от полного перебора каждого пароля в отдельности.

Содержание

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

Например, вы шифруете и храните свои пароли в MD5. Если ваша база будет украдена — злоумышленник довольно просто восстановит большинство исходных паролей используя заранее подготовленные радужные таблицы. Если же мы «посолим» пароль, то есть соединим строчку из 10-20 случайных символов с паролем и уже от этой строчки найдем MD5 — стандартные таблицы не будут работать, так как они не расчитаны на поиск такой длинной строки.

Кроме того, для набора хешей увеличится сложность поиска паролей простым перебором, так как для того, чтобы проверить один «пароль-кандидат» для всех хешей из набора, потребуется производить хеш-преобразование для каждой уникальной соли в наборе. Для несолёных же хешей требуется лишь одна операция хеширования, затем результирующий хеш необходимо просто сравнить (стоит заметить, что операция сравнения проще, чем хеширование) со всеми хешами набора.

Соль, использованную для каждого пароля мы храним рядом с полученным хешем, например, в отдельном столбце таблицы паролей. Когда нам необходимо проверить пароль пользователя — мы извлекаем соль, соединяем с введенным паролем и находим от этой строки MD5. Если пароль верный — хеш совпадет с тем, который хранится в базе.

Использование того или иного интерфейса к unix библиотеке crypt еще проще. Для создания хеш-строки при регистрации достаточно передать этой функции сам пароль — соль будет сгенерирована автоматически (хотя есть возможность и подготовить соль самому). Для проверки необходимо передать проверяемый пароль и строку полученную при регистрации. Так как в этой строке содержится вся необходимая информация (алгоритм, соль, результат хеширования) — этого достаточно, что бы выдать положительный или отрицательный результат.

Вот пример создания хеша с солью на PHP:

$password = 'password'; //Сам пароль hash1=md5(hash1 = md5(hash1=md5(password); //Хешируем первоначальный пароль salt=′sflprt49fhi2′;//Генерируемслучайныйнаборсимволов(соль)<spanclass="katex"><spanclass="katex−mathml"><mathxmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi><mi>a</mi><mi>s</mi><mi>h</mi><mn>2</mn><mo>=</mo><mi>m</mi><mi>d</mi><mn>5</mn><mostretchy="false">(</mo></mrow><annotationencoding="application/x−tex">hash2=md5(</annotation></semantics></math></span><spanclass="katex−html"aria−hidden="true"><spanclass="base"><spanclass="strut"style="height:0.6944em;"></span><spanclass="mordmathnormal">ha</span><spanclass="mordmathnormal">s</span><spanclass="mordmathnormal">h</span><spanclass="mord">2</span><spanclass="mspace"style="margin−right:0.2778em;"></span><spanclass="mrel">=</span><spanclass="mspace"style="margin−right:0.2778em;"></span></span><spanclass="base"><spanclass="strut"style="height:1em;vertical−align:−0.25em;"></span><spanclass="mordmathnormal">m</span><spanclass="mordmathnormal">d</span><spanclass="mord">5</span><spanclass="mopen">(</span></span></span></span>hash1.salt = 'sflprt49fhi2'; //Генерируем случайный набор символов (соль) <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi><mi>a</mi><mi>s</mi><mi>h</mi><mn>2</mn><mo>=</mo><mi>m</mi><mi>d</mi><mn>5</mn><mo stretchy="false">(</mo></mrow><annotation encoding="application/x-tex">hash2 = md5(</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">ha</span><span class="mord mathnormal">s</span><span class="mord mathnormal">h</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">m</span><span class="mord mathnormal">d</span><span class="mord">5</span><span class="mopen">(</span></span></span></span>hash1 . salt=sflprt49fhi2;//Генерируемслучайныйнаборсимволов(соль)<spanclass="katex"><spanclass="katexmathml"><mathxmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi><mi>a</mi><mi>s</mi><mi>h</mi><mn>2</mn><mo>=</mo><mi>m</mi><mi>d</mi><mn>5</mn><mostretchy="false">(</mo></mrow><annotationencoding="application/xtex">hash2=md5(</annotation></semantics></math></span><spanclass="katexhtml"ariahidden="true"><spanclass="base"><spanclass="strut"style="height:0.6944em;"></span><spanclass="mordmathnormal">ha</span><spanclass="mordmathnormal">s</span><spanclass="mordmathnormal">h</span><spanclass="mord">2</span><spanclass="mspace"style="marginright:0.2778em;"></span><spanclass="mrel">=</span><spanclass="mspace"style="marginright:0.2778em;"></span></span><spanclass="base"><spanclass="strut"style="height:1em;verticalalign:0.25em;"></span><spanclass="mordmathnormal">m</span><spanclass="mordmathnormal">d</span><spanclass="mord">5</span><spanclass="mopen">(</span></span></span></span>hash1.salt); //Складываем старый хеш с солью и пропускаем через функцию md5()

В данном примере соль является детерминированной строкой, в реальных проектах следует применять только случайные соли, сгенерированные каким-либо ГПСЧ.

Пример использования функции crypt на языке PHP:

// Создание хеша $hash = crypt('password'); // crypt сама генерирует соль и хеширует используя дефолтный алгоритм // Если есть необходимость использовать определенный алгоритм, то нужно подготовить соль в формате crypt, а именно // <алгоритм><алгоритм><алгоритм><строка соли>$ или <алгоритм><алгоритм><алгоритм><параметры хеширования>$<строка соли>$ если алгоритм требует дополнительные параметры // Например: 111xdtfsfre$ - MD5 алгоритм

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

Частые вопросы о соли для новичков

Соль в системах 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 призвал полностью отказаться от созданного им алгоритма, как не обеспечивающего в современных условиях ощутимого увеличения времени вычисления хеша, а значит и не защищающего от полного перебора[6]

Литература

Примечания

  1. Проект OpenNet: MAN crypt (3) Библиотечные вызовы (FreeBSD и Linux)
  2. FreeBSD CVS log for src/lib/libcrypt/crypt.c
  3. Niels Provos, David Mazières A Future-Adaptable Password Scheme. Paper - 1999 USENIX Annual Technical Conference, June 6-11, 1999, Monterey, California, USA (June 1999). Архивировано из первоисточника 9 августа 2012.
  4. Unix crypt with SHA-256/512
  5. crypt(3) - Linux manual page
  6. Md5crypt Password scrambler is no longer considered safe by author