Рейтинг:2

Должен ли я использовать HMAC для создания токена HASH из нескольких частей?

флаг jp

У меня есть веб-API с настраиваемой системой аутентификации API, у каждого пользователя есть Секретный ключ и общественность АпиКей. Используя эти два ключа, клиент (или пользователь) может сгенерировать токен для аутентификации на сервере.

Рассмотрим эту функцию, генерирующую токен аутентификации.

общедоступная строка GetToken (строка apiKey, строка secretKey, строка expireTimestamp)
{
    используя var hashAlgorithm = SHA256.Create();
    var byteValue = Encoding.UTF8.GetBytes (apiKey + secretKey + expireTimestamp)
    var byteHash = hashAlgorithm.ComputeHash(byteValue)
    вернуть Convert.ToBase64String(byteHash) + expireTimestamp
}

Таким образом, токен представляет собой комбинацию

$$token = SHA256(APIKey \mathbin\| SecretKey \mathbin\| expireTimestamp) \mathbin\| expireTimestamp$$

Используя этот токен, у нас есть уникальная система аутентификации с истекающим сроком действия для наших API,

вопросы:

  1. Должен ли я объединить ключи + expTime или использовать что-то вроде HMAC? этот сценарий уязвим для таких атак, как атаки на увеличение длины без ГМАК?
  2. В чем уязвимость этой системы (если она есть)?
fgrieu avatar
флаг ng
Комментарии не для расширенного обсуждения; они были [перемещены в чат](https://chat.stackexchange.com/rooms/132054/discussion-on-question-by-alireza-should-i-use-hmac-to-create-a-multiple-part -га).
Рейтинг:2
флаг in

С использованием $$token = SHA256(APIKey \mathbin\| SecretKey \mathbin\| expireTimestamp) \mathbin\| expireTimestamp$$

не является безопасным, так как может вызвать атаку с расширением длины, например;

$$token2 = SHA256(APIKey \mathbin\| SecretKey \mathbin\| expireTimestamp \| \color{red}{extension}) \mathbin\| (expireTimestamp \| \color{red}{расширение}) $$

Это действительный токен для подделки.

NIST по вызову кандидатов SHA3 должен быть устойчивый к растяжению в длину атаки. Теперь Keccak назвал SHA3 победителем, а Blake2 по-прежнему остается хорошей альтернативой конкурентам. Оба устойчивы к атакам на увеличение длины, Кекчак использует емкость, а Блейк2 использует ХАЙФА конструкции, защищены от атак расширения длины.

Для смягчения можно использовать HMAC;

$$token = \operatorname{HMAC-SHA256}(privateKey, publicKey \mathbin\| expireTimestamp) \mathbin\| expireTimestamp$$ Обратите внимание, что это вызовет SHA-256 как минимум два раза (три раза, если ключ длиннее, чем размер блока хеш-функции, 512-битный для SHA-256).

Вместо HMAC мы можем использовать BLAKE2. BLAKE2 очень быстрый и даже у нас есть параллельная версия БЛЕЙК3 и используя

$$token = \operatorname{BLAKE2}( publicKey \mathbin\| privateKey \mathbin\|expireTimestamp) \mathbin\| expireTimestamp$$ безопасно.

NIST также стандартизировал MAC для SHA3 с именем КМАК( или же здесь).

И BLAKE2, и KMAC предпочтительнее HMAC.

Если вы настаиваете на использовании SHA2 с 256-битным выходным размером, используйте SHA-512/256, который является усеченной версией SHA-512/256 с другими начальными значениями для разделения доменов. SHA-512/256 невосприимчив к атакам расширения длины и по своей конструкции совместим с 64-битным процессором.

AliReza Sabouri avatar
флаг jp
спасибо @kelalaka, это действительно помогает. ваш пример с «расширением» создал для меня еще один вопрос: что, если все 3 части всегда имеют фиксированную длину. например (apikey=36, privateKey=44, expireTime=10). Уязвим ли SHA256 в данном случае или нет. поскольку `expireTime` имеет фиксированную длину, никто не может добавить к нему расширение
kelalaka avatar
флаг in
Если вы знаете размеры и проверяете их, то атаки расширения больше нет, пока злоумышленник не обманет и эту часть. Я бы пошел на более длинную атаку, чтобы устранить поверхности атаки.
kelalaka avatar
флаг in
Запись; Я обновил ответ, включив в него SHA-512/256, который вы можете использовать.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.