Elettracompany.com

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Hash hmac php

hash_hmac

(PHP 5 >= 5.1.2, PHP 7, PECL hash >= 1.1)

hash_hmac — Генерация хеш-кода на основе ключа, используя метод HMAC

Описание

Список параметров

Имя выбранного алгоритма хеширования (например, «md5», «sha256», «haval160,4» и т.д.) Смотрите hash_hmac_algos() для получения списка поддерживаемых алгоритмов.

Сообщение для хеширования.

Общий секретный ключ, используемый для генерации HMAC хеш-кода.

Когда установлено в TRUE , выводит необработанные двоичные данные. При FALSE выводит данные в шестнадцатеричной кодировке в нижнем регистре.

Возвращаемые значения

Возвращает строку содержащую вычисленный хеш-код в шестнадцатеричной кодировке в нижнем регистре. Если raw_output задан как TRUE , то возвращается хеш-код в виде бинарных данных. Возвращает FALSE , если algo неизвестен или не является криптографической хеш-функцией.

Список изменений

Примеры

Пример #1 Пример использования hash_hmac()

Результат выполнения данного примера:

Смотрите также

  • hash() — Генерирует хеш-код (дайджест сообщения)
  • hash_hmac_algos() — Возвращает список зарегистрированных алгоритмов хеширования, применимых для hash_hmac
  • hash_init() — Инициализация инкрементального контекста хеширования
  • hash_hmac_file() — Генерация хеш-кода на основе ключа, используя метод HMAC и содержимое полученного файла

User Contributed Notes 16 notes

Very important notice, if you pass array to $data, php will generate a Warning, return a NULL and continue your application. Which I think is critical vulnerability as this function used to check authorisation typically.

Example:

Of course not documented feature.

Please be careful when comparing hashes. In certain cases, information can be leaked by using a timing attack. It takes advantage of the == operator only comparing until it finds a difference in the two strings. To prevent it, you have two options.

Option 1: hash both hashed strings first — this doesn’t stop the timing difference, but it makes the information useless.

Option 2: always compare the whole string.

As Michael uggests we should take care not to compare the hash using == (or ===). Since PHP version 5.6 we can now use hash_equals().

So the example will be:

Here is an efficient PBDKF2 implementation:

For signing an Amazon AWS query, base64-encode the binary value:

Sometimes a hosting provider doesn’t provide access to the Hash extension. Here is a clone of the hash_hmac function you can use in the event you need an HMAC generator and Hash is not available. It’s only usable with MD5 and SHA1 encryption algorithms, but its output is identical to the official hash_hmac function (so far at least).

$size ) <
$key = str_pad ( pack ( $pack , $algo ( $key )), $size , chr ( 0x00 ));
> else <
$key = str_pad ( $key , $size , chr ( 0x00 ));
>

A function implementing the algorithm outlined in RFC 6238 (http://tools.ietf.org/html/rfc6238)

// Pad to 8 chars (if necessary)
if ( strlen ( $data )

Simple implementation of hmac sha1

64 ) <
$key = str_pad ( sha1 ( $key , true ), 64 , chr ( 0 ));
>
if ( strlen ( $key )

The Implementation of the PBKDF2 key derivation function as described in RFC 2898 can be used to not only get the hashed KEY but also a specific IV.

To use, one would use it as follows:-

The function should be:-

For signing an Amazon AWS query, base64-encode the binary value:

The hotp algorithms above work with counter values less than 256, but since the counter can be larger, it’s necessary to iterate through all the bytes of the counter:

= 0 ; $i —)
<
$cur_counter [ $i ] = pack ( ‘C*’ , $counter );
$counter = $counter >> 8 ;
>
$bin_counter = implode ( $cur_counter );
// Pad to 8 chars
if ( strlen ( $bin_counter )

> 3 );
return $raw_output ? $revhash : bin2hex ( $revhash );
>

# replaces hash_hmac(‘tiger.
function hash_hmac_tiger_rev ( $algo , $data , $key , $raw_output = false ) <
if ( strlen ( $key ) > 64 ) $key = hash_tiger_rev ( $algo , $key );
$key = str_pad ( $key , 64 , chr ( 0 ));
$o_pad = str_repeat ( «\» , 64 ) ^ $key ; # «» = chr(0x5C)
$i_pad = str_repeat ( «6» , 64 ) ^ $key ; # «6» = chr(0x36)
return hash_tiger_rev ( $algo , $o_pad .
hash_tiger_rev ( $algo , $i_pad . $data , true ), $raw_output );
>

# always the new version of tiger
function hash_hmac_new ( $algo , $data , $key , $raw_output = false ) <
if ( phpversion () > ‘5.4’ || ! preg_match ( ‘/^tiger(128|160|192),(3|4)$/’ , $algo ))
return hash_hmac ( $algo , $data , $key , $raw_output );
else
return hash_hmac_tiger_rev ( $algo , $data , $key , $raw_output );
>

# always the old version of tiger
function hash_hmac_old ( $algo , $data , $key , $raw_output = false ) <
if ( phpversion ()

Симметричные схемы аутентификации сообщений, основанные на криптографических хэш-функциях

Код аутентификации сообщения (Message authentication code – MAC) представляет собой криптографическую контрольную сумму сообщения.

Contents

Постановка задачи

MAC вычисляется на основе ключа и текста сообщения произвольной длины и используется для проверки целостности сообщения. Для вычисления MAC используются ключевые алгоритмы хэширования (или ключевые надстройки над алгоритмами хэширования), алгоритмы блочного шифрования или специальные алгоритмы вычисления кодов аутентификации сообщений. В отличие от алгоритмов схемы цифровой подписи (ЭЦП), в которых для вычисления ЭЦП используется закрытый ключ, а для проверки ЭЦП – вычисляемый из закрытого открытый ключ, при вычислении и проверке MAC используется один и тот же секретный ключ. Поэтому, в отличие от ЭЦП, MAC не используется для установления авторства сообщения, поскольку секретный ключ принадлежит более, чем одному пользователю.

Алгоритм HMAC

Алгоритм HMAC (Hash-based Message Authentication Code – код аутентификации сообщения на основе хэширования). Данный вид аутентификации подразумевает наличие у клиента и сервера некоего секретного ключа, который известен только им двоим. То есть это механизм, который использует криптографические хеш-функции в сочетании с секретным ключом. HMAC является одним из вариантов MAC и, следовательно, используется для контроля целостности сообщений. В данном случае в основе алгоритма лежит функция хэширования, которая позволяет вычислить код аутентификации сообщения.

Принцип работы

  • Размер ключа выравнивается с размером блока используемого алгоритма хэширования;
  • если ключ key длиннее блока, он укорачивается путем применения к нему используемого алгоритма хэширования hash:

отметим, что размер выходного значения алгоритма хэширования обычно много меньше размера блока хэшируемых данных – например, соответственно 128 и 512 битов для алгоритма MD4; рекомендуется минимальный размер ключа, равный размеру выходного значения алгоритма хэширования;

  • если размер ключа меньше размера блока, то выровненный ключ k получается путем дополнения до размера блока нулевыми битами исходного (или укороченного) ключа key.
  • Выровненный ключ k складывается по модулю 2 с константой C1, которая представляет собой блок данных, заполненный байтами с шестнадцатеричным значением 36; аналогичным образом ключ k также складывается с константой C2, которая представляет собой блок данных, заполненный байтами с шестнадцатеричным значением 5С:

ki = k ⊕ C1; ko = k ⊕ C2.

  • Вычисляется хэш-значение от результата конкатенации модифицированного ключа ki и сообщения m:
  • Выходным значением алгоритма HMAC является хэш-значение от результата конкатенации модифицированного ключа ko и полученного на предыдущем шаге значения t:

hmac = hash(ko || t).

Таким образом, при вычислении HMAC используемый алгоритм хэширования применяется дважды; каждый раз с участием модифицированного ключа. Размер выходного значения алгоритма HMAC равен размеру выходного значения алгоритма хэширования, а общая формула вычисления HMAC (без учета выравнивания ключа) выглядит следующим образом:

HMAC(k, m) = hash((k ⊕ C2) || hash((k ⊕ C1) || m)).

Алгоритмы, построенные с помощью HMAC, традиционно называют следующим образом:

  • «HMAC-x», где «x» – используемый алгоритм хэширования, например, HMAC-MD4;
  • «HMAC-x-k» в тех случаях, где выходное значение алгоритма хэширования может быть усечено (т. е. может использоваться частично); в данном случае «k» – размер выходного значения алгоритма HMAC в битах; пример – алгоритм HMAC-SHA1-80.
Читать еще:  Matlab онлайн бесплатно

Принцип использования и быстродействие

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

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

Криптостойкость

Криптостойкость HMAC зависит, прежде всего, от следующих факторов:

  • криптостойкость используемого алгоритма хэширования;
  • размер выходного значения алгоритма;
  • размер и качество ключа.

Контексты атак на HMAC и «классическое» использование алгоритма хэширования заметно различаются. Атакующий алгоритм HMAC может преследовать следующие цели:

  • подобрать сообщение, HMAC которого равен эталонному или равен HMAC эталонного сообщения;
  • это похоже на атаки на классическое применение алгоритма хэширования по поиску первого или второго прообраза;
  • найти корректную пару «сообщение – код аутентификации данного сообщения» или вычислить код аутентификации сообщения для заданного сообщения без знания секретного ключа;
  • получить ключ, используемый для вычисления HMAC.

Псевдокод

Следующий псевдокод показывает, как HMAC может быть реализован:

Алгоритм NMAC

Алгоритм NMAC был также предложен авторами алгоритма HMAC. Данный алгоритм позволяет использовать при аутентификации сообщений два ключа: k1 и k2. Формула вычисления NMAC крайне проста:

NMAC(k1, k2, m) = hash(k2, hash(k1, m)),

где второй параметр функции hash() обозначает хэшируемое сообщение, а первый параметр – нестандартный вектор инициализации, в качестве которого используется ключ (соответственно, k1 и k2 обозначают уже выровненные до размера вектора инициализации ключи). NMAC является, фактически, обобщением HMAC, поскольку ключи k1 и k2 можно использовать независимо, а можно представить как производные от единственного ключа k, вычисляемые следующим образом:

k1 = h(k ⊕ C1); k2 = h(k ⊕ C2),

где h() – функция сжатия используемого алгоритма хэширования; в данном случае применяется стандартный вектор инициализации алгоритма.

Hash строка в Java эмуляция функции php hash_hmac с помощью ripemd160 с ключом

Я пытаюсь hash строку в Java, используя ripemd160 для эмуляции вывода следующего php:

Попытка 1

Первоначально я попытался эмулировать его, используя следующее. однако я не верю, что можно использовать ripemd160 в качестве алгоритма getInstance?

Или, может быть, это так,и я просто не включил его локально?

Попытка 2

Это заставило меня искать другие способы достижения вышеуказанного, через SO и Google я обнаружил, что просмотр BouncyCastle может быть лучшим способом пойти.

Затем я нашел этот пост, в котором говорится о хешировании с использованием того же алгоритма, что и я, а также BouncyCastle, он просто не использует ключ. ( Не удается вывести правильный hash в Java. Что случилось? )

У меня это работает, как и следовало ожидать.

Вопрос

Вы заметите, что в попытке 2 в настоящее время нет способа предоставить ключ для хэширования, мой вопрос заключается в том, как я могу адаптировать эту функцию, чтобы иметь возможность предоставить ключ и выполнить последний этап того, что мне нужно сделать, чтобы иметь возможность эмулировать исходную функцию php: hash_hmac(‘ripemd160’, $string, $key);

1 Ответ

Использование RIPEMD160 из Bouncy Castle прекрасно, но вам придется реализовать HMAC, а не только hash ваших данных. HMac это просто H(K XOR opad, H(K XOR ipad, text)) , где H — ваша функция hash, K -секрет, text -сообщение, а opad и ipad -предопределенные константы. Чтобы продемонстрировать, как это работает, я перевел следующее Из реализации Python :

Bouncy Castle реализует этот алгоритм в своем классе HMac , поэтому более короткий вариант этого кода

Похожие вопросы:

Мне нужно получить тот же результат в Perl, что hash_hmac(‘ripemd160’, $data, $key) производит в PHP Удалось trace это до двух модулей perl, просто не могу заставить их работать вместе.

Я портирую приложение PHP на C++. Приложение PHP использует эту функцию: hash_hmac-генерирует значение с ключом hash, используя метод HMAC Если у меня есть этот код, что он на самом деле делает.

У меня есть строка в PHP, которая преобразуется в массив байтов и хэшируется. Строка, преобразуемая в массив байтов, выглядит следующим образом: g. ЧР(0) . poo; Мне нужно эквивалентный массив байтов.

Например, пароль Hello World, Как я могу заставить его вернуться к строке RIPEMD160 Hash? Предполагается, что он возвращает строку: a830d7beb04eb7549ce990fb7dc962e499a27230. Я уже искал в интернете.

Я пытаюсь hash строку в Swift 3 (and/or objective C) с помощью ripemd160 эмулировать вывод следующего php: $string = ‘string’; $key = ‘test’; hash_hmac(‘ripemd160’, $string, $key); // outputs.

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

Я переношу некоторый код с PHP на .NET (я не разработчик PHP), и все это выглядит довольно просто, кроме следующей строки: public function hash($message, $secret) < return.

Я хочу преобразовать ниже PHP hash-код в эквивалентный ruby или rails код. $publicHash = ‘3441df0babc2a2dda551d7cd39fb235bc4e09cd1e4556bf261bb49188f548348’; $privateHash =.

Я пытаюсь создать значение с ключом hash, используя метод HMAC для ввода сообщения данных и секретного ключа. Каков эквивалент для следующего кода PHP в C#? PHP #!/usr/bin/php

Hash hmac php

HMAC (сокращение от англ. hash-based message authentication code , хеш-код аутентификации сообщений). Наличие способа проверить целостность информации, передаваемой или хранящийся в ненадежной среде является неотъемлемой и необходимой частью мира открытых вычислений и коммуникаций. Механизмы, которые предоставляют такие проверки целостности на основе секретного ключа, обычно называют кодом аутентичности сообщения (MAC). Как правило, МАС используется между двумя сторонами, которые разделяют секретный ключ для проверки подлинности информации, передаваемой между этими сторонами. Этот стандарт определяет MAC. Механизм, который использует криптографические хеш-функции в сочетании с секретным ключом называется HMAC.

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

Разработчики: Хьюго Кравчик, Михир Беллар и Ран Каннетти.

Содержание

Описание

В последние годы наблюдается повышенный интерес к разработке MAC на основе криптографических хэш-функций, например, MD5, SHA-1 или RIPEMD-160. А мотивы этого интереса просты:

  • Криптографические хэш-функции обычно в программах работают быстрее, чем при использовании симметричных блочных шифров, такие как DES.
  • Библиотечные коды для криптографической хэш-функции широко доступны.
  • Хэш-функции, такие как MD5, не предназначены для использования в качестве MAC и не могут быть использованы непосредственно для этой цели, поскольку они не опираются на секретный ключ. Было сделано несколько предложений для включения секретного ключа в существующие хэш-алгоритмы. HMAC получил наибольшую поддержку.
Читать еще:  Matlab математические функции

HMAC был выбран в качестве обязательной (англ. mandatory to implement ) при реализации MAC для IP-безопасности, и используется в других интернет-протоколах, таких, как Transport Layer Security (TLS, который вскоре заменит Secure Sockets Layer) и Secure Electronic Transaction (SET).

Принцип работы

На рисунке 1 показан общий алгоритм HMAC:

  1. Если длина ключа К = b, то = K . Переходим сразу к шагу 4.
  2. Если длина ключа K > b, то применяем функцию H к ключу K для получения L-байтовой строки. Добавить нули к левой части этой строки для создания b-байтовой строки .Переходим сразу к шагу 4.
  3. Если длина ключа K [1] :

Одна из возможных реализаций алгоритма на языке PHP [2] :

Примеры

Продемонстрируем пример работы алгоритма для различных входных данных.

Первый параметр — 160-битный ключ. Второй параметр — передаваемое сообщение. На выходе мы получаем 160-битный код аутентификации.

Рассмотрим более подробно алгоритм HMAC на примере хэш-функции SHA-1 с 20-байтовым ключом:
Имеем: текстовое сообщение
Text: Hello World

и 20-байтовый ключ в шестнадцатеричном виде
Key:
0x707172737475767778797a7b7c7d7e7f80818283

1 шаг:
Дополняем Key нулевыми байтами до размера блока SHA-1(64 байта)
:
70717273 74757677 78797a7b 7c7d7e7f
80818283 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000

2 шаг:
Побитовое исключающее ИЛИ
ipad:
46474445 42434041 4e4f4c4d 4a4b4849
b6b7b4b5 36363636 36363636 36363636
36363636 36363636 36363636 36363636
36363636 36363636 36363636 36363636

3 шаг:
Конкатенация исходного сообщения с результатом на шаге 2
(Key ipad)||text:
46474445 42434041 4e4f4c4d 4a4b4849
b6b7b4b5 36363636 36363636 36363636
36363636 36363636 36363636 36363636
36363636 36363636 36363636 36363636
48656c6c 6f20576f 726c64

4 шаг:
Применим SHA-1 к результату, созданному на шаге 3
Hash((Key ipad)||text):
0d42b899 d804e19e bfd86fc4 4f414045 dfc9e39a

5 шаг:
Побитовое исключающее ИЛИ
opad:
2c2d2e2f 28292a2b 24252627 20212223
dcdddedf 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c

6 шаг:
Конкатенация результата хеширования на шаге 4 с результатом на шаге 5
( opad) || Hash((Key ipad)||text):
2c2d2e2f 28292a2b 24252627 20212223
dcdddedf 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
0d42b899 d804e19e bfd86fc4 4f414045
dfc9e39a

7 шаг:
Применим SHA-1 к результату, созданному на шаге 6
HMAC(Key, Text) = Hash(( opad) || Hash((Key ipad)||text)):
2e492768 aa339e32 a9280569 c5d02626 2b912431
получили 20 байтовый HMAC(Key, Text)

Вопросы использования

Полученный код аутентичности позволяет убедиться в том, что данные не изменялись каким бы то ни было способом с тех пор как они были созданы, переданы или сохранены доверенным источником. Для такого рода проверки необходимо, чтобы, например, две доверяющие друг другу стороны заранее договорились об использовании секретного ключа, который известен только им. Тем самым гарантируется аутентичность источника и сообщения. Недостаток такого подхода очевиден — необходимо наличие двух доверяющих друг другу сторон.

Безопасность

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

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

  1. В первом типе атаки, мы можем рассматривать функции сжатия F в качестве эквивалента хэш-функции применяемой для сообщения, состоящие из единичного блока длиной B-бит. Для этого на вход хэш-функции подается случайное значение длиной N битов. Нападение на хэш-функцию требует или полного перебора ключа, который обладает уровенью сложности порядка или с помощью атаки «дней рождения», которая является частным случаем второго нападения, что обсуждается далее.
  2. Во втором типе атаки, злоумышленник ищет два сообщения М и М ‘, которые получаются от одинаковой хеш-функции: H (M) = H (M’). Этот тип атаки известен также как атака «дней рождения». Уровень сложности данной атаки равен для хэша длины n. Исходя из этого, безопасность MD5 ставится под вопрос, потому что уровень сложности для него , что уже не выглядит невозможным при помощи современных технологий. Означает ли это, что 128-битная хэш-функция такая как MD5 не подходит для HMAC? Ответ на этот вопрос — нет, что последует из следующих аргументов. При атаке на MD5, злоумышленник может выбрать любой набор сообщений и работать офлайн над поиском коллизий. Так как злоумышленник знает алгоритм хеширования и начальные условия, злоумышленник может создать хэш-код для каждого из сообщений. Однако, при атаке HMAC, злоумышленник не сможет генерировать пару :(сообщение — код) в удаленном(оффлайн) режиме, так как злоумышленник не знает Key. Таким образом, злоумышленник должен следить за последовательностью сообщений, порождаемых HMAC с тем же ключом и выполнять атаку на них. Для хэш-кода длиной 128 бит, для этого требуется блоков или битов сгенерированных с помощью того же ключа. Для 1-Гбит соединения, нужно было бы следить за потоком сообщений, если он не изменят Key, в течение 150 000 лет, чтобы добиться успеха. Таким образом, если скорость имеет значение, это вполне приемлемо использовать MD5, а не SHA-1 в качестве встроенных хэш-функции для HMAC.

Стандартизация

Конструкция HMAC стандартизирована организациями ANSI, IETF, ISO и NIST.

Openssl_digest vs hash vs hash_hmac? Разница между SALT & HMAC?

Я хочу использовать SHA512 для хранения паролей. Для этого, какие из openssl_digest , hash и hash_hmac следует использовать и почему?

В чем разница между SALT и HMAC ?

Я просто прочитал, что HMAC построен поверх хэш-функции.

Итак, действительно необходимо SHA512+SALT+HMAC или SHA512+SALT или SHA512+HMAC ?

security php passwords hash

3 ответа

49 ircmaxell [2012-06-25 22:17:00]

Итак, во-первых, позвольте мне разобраться. openssl_digest() === hash() . Это просто другая функция с другим именем, которое делает то же самое. Он вычисляет криптографический хеш ввода.

Итак, теперь у нас возникает вопрос: при сохранении паролей, что лучше: hash или hash_hmac ?

Краткий ответ:

Длинный ответ:

Как оказалось, The Rainbow Table Is Dead. Просто использовать hash($password . $salt) или даже hash_hmac($password, $salt) недостаточно для хранения паролей. Период. Если вы это сделаете, остановитесь прямо сейчас.

Причина проста: время вычислений на компьютере (или графическом процессоре) невероятно дешево. Это так дешево, что для грубой силы список паролей достаточно дешев, что вам нужно беспокоиться об этом. Помните, что функции хэша рассчитаны на быструю работу. Не дорого.

Но, как выясняется, есть способ сделать эти быстрые хеш-функции более дорогими. На самом деле это довольно просто: итерация.

Теперь я знаю, о чем вы думаете. Вы просто перейдете через хэш:

Конечно, это достаточно хорошо, не так ли? Неа. Как объяснено в Основном Различия между Хешированием и Шифрованием, это не очень хорошая идея. Так почему бы просто не вернуть обратно пароль и соль снова?

Фактически, это именно то, что использует PHPASS (слегка измененный, но это базовый алгоритм).

Итак, теперь 1 вызов hash_password выполняет 1000 циклов хеширования.

Но можем ли мы улучшить это?

Ну, как выясняется, мы можем. Следующей логической задачей было бы увидеть, можем ли мы получить больше циклов хеширования за такое же количество времени. И здесь приходит hash_hmac() . Как оказалось, HMAC использует два хэш-цикла каждый раз, когда он вызывал. И поскольку все это C, это занимает примерно в 1,5 раза больше времени, которое hash() принимает для выполнения одного раунда.

Таким образом, это означает, что если мы заменим hash на hash_hmac , мы сразу увидим 33% -ное увеличение количества работы, выполняемой за указанное время. Итак, теперь мы здесь:

И на самом деле это основной внутренний цикл PBKDF2.

Но можем ли мы поправляться?

Да, опять же, мы можем поправляться. Если мы посмотрим внимательно, мы увидим, что, помимо пароля и соли, все эти алгоритмы используют очень небольшой объем памяти. В случае sha512 они будут использовать от 128 до 256 байтов (буферы и состояние) для хеширования пароля. Поскольку использование памяти настолько мало, тривиально запускать много из них одновременно бок о бок в графическом процессоре. Если бы мы могли увеличить использование памяти.

Ну, как оказалось, мы можем просто использовать bcrypt , который является адаптивным алгоритмом хэширования. Он имеет преимущество в том, что он использует больше памяти, чем вышеупомянутые алгоритмы (порядка от 4 до 5kb). Таким образом, он более устойчив к распараллеливанию. И он сопротивляется жестокому форсированию, поскольку он вычислительно дорогой.

К счастью, он доступен для PHP:

Обратите внимание, что crypt() использует множество алгоритмов, но алгоритмы $2y$ и $2a$ bcrypt .

Но можем ли мы улучшить это?

Вид-оф. Существует относительно новый алгоритм, называемый scrypt. Это лучше, чем bcrypt, потому что он так же дорого стоит вычислить, но использует LOT больше памяти (от порядка 20 мб до 40 мб для хеширования одного пароля). Поэтому он еще более устойчив к распараллеливанию.

К сожалению, scrypt пока недоступен в PHP (я работаю над его изменением). До тех пор используйте bcrypt .

Sidenote

После недавних уроков из LinkedIn, LastFM, Hotmail, Gawker и т.д., очевидно, что много людей делают это неправильно. Не делайте это неправильно, используйте библиотеку с проверенным алгоритмом. Используйте CRYPT_BLOWFISH (bcrypt), используйте PHPASS, используйте PasswordLib. Но не изобретайте свои собственные, потому что вы не хотите тянуть зависимость. Это просто халатность.

7 DarkDust [2012-01-21 20:16:00]

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

A salt используется для добавления бит «случайности» в текст, который должен быть зашифрован или хэширован. Дело в том, что даже если вы зашифруете один и тот же текст несколько раз, вы получите разные результаты. Это затрудняет некоторые атаки. Это то, что вы хотите: SHA512(salt+password) .

Для хранения паролей самым безопасным способом я мог бы предположить:

(отказ от ответственности: я не очень разбираюсь в криптографии, и может быть лучшее решение)

  • Клиент (код JavaScript?) будет генерировать значение соли.
  • Затем клиент объединяет соль и пароль и запускает результат с помощью вашего алгоритма хеширования.
  • Затем клиент передает значение соли и хеша на сервер, который хранит его (предпочтительно в разных местах).

Чтобы проверить пароль, выполните следующие действия:

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

Конечно, вы можете передавать пароль в виде открытого текста и делать все соление и хеширование на сервере, но это значительно ослабит ваше решение. Вы никогда не должны передавать пароль в виде открытого текста.

Но часть «передать соль клиенту» может быть проблемой. Один из способов, который я мог бы себе представить, — это как-то извлечь соль из имени пользователя (проще всего: просто сделать lowercase(username) + password ), но проблема в том, что соль будет предсказуемой и, таким образом, немного ослабнет ваше решение немного. Тем не менее, это все еще лучше, чем передача «сырого» хеша, и вам даже не нужно было бы хранить соль, поскольку вы могли бы извлекать ее из имени пользователя каждый раз. Если ваш пароль DB будет украден, он все равно будет сопротивляться атаке радужного стола с помощью этого подхода «солить с именем пользователя».

Проблема в том, что атака «человек в середине» по-прежнему возможна. Если злоумышленник перехватывает имя пользователя и хеш, он имеет всю соответствующую информацию, и он не будет отличаться от передачи пароля открытого текста. Таким образом, вы можете защитить соединение с SSL (HTTPS).

По мнению экспертов ИТ-безопасности:

Я бы дал ответ в соответствии с SO точкой зрения.

  • openssl_digest — вычисляет дайджест.
  • hash Создать хэш-значение (дайджест сообщения)
  • hash_hmac — Создайте хеш-значение с ключом, используя метод HMAC

И в криптографии код проверки подлинности сообщений хэш (HMAC) является конкретной конструкцией для вычисления кода аутентификации сообщения (MAC) с использованием криптографической хэш-функции в сочетании с секретным ключом.

Как сказано ircmaxell, hash или hash_hmac не лучше хранить пароли с SHA-512. Я бы сказал, вы можете использовать openssl_digest для хранения паролей.

  • Хэш в этом контексте является односторонней функцией — то есть функцией, которая очень легко находит результат из аргумент (пароль), но трудно (или невозможно) найти любой аргумент, который генерирует данный результат.
  • A salt — это некоторые вспомогательные данные, которые дополняют аргумент хэш-функции. Это полезно, поскольку это предотвращает случайное обнаружение паролей через наблюдение, что два хэшированных пароля имеют одинаковые значения. С солью сохраненное/переданное значение будет только идентичным, если совпадают соль и пароль.
  • HMAC относится к приложению хеша (и дополнительной соли) к «коду аутентификации сообщения», который, в зависимости от по контексту может быть пароль. или, по крайней мере, там ничего не мешает вам передавать пароль в HMAC, как если бы это был код аутентификации сообщения.

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

Соль обычно представляет собой случайное значение, которое не является секретом. То есть, когда вы используете термин соль, который вы обычно ссылаетесь на ситуации, когда есть случайное значение, которое может быть хорошо известно злоумышленнику. Охрана поэтому система не должна зависеть от содержания соли секрет. В этих ситуациях HMAC часто не очень хороший выбор.

Сравнение HMAC и Salt не является логичным. Лично я бы использовал соль и функцию хеша. и я не был бы параноик о силе хеш-функции, так как вряд ли она будет слабым звеном в любой практической системе.

Ссылка на основную публикацию
Adblock
detector