2013-08-06 2 views
8

Мы используем следующий код для генерации хэша HMAC против чувствительного значения в C#Разница между HMACSHA256 и HMACSHA512

public string GenerateHMac(string key, string message) 
{ 
    var decodedKey = Convert.FromBase64String(key); 

    var hasher = new HMACSHA256(decodedKey); 

    var messageBytes = Encoding.Default.GetBytes(message); 

    var hash = hasher.ComputeHash(messageBytes); 

    return Convert.ToBase64String(hash); 
} 

Ключ передается в 256 бит базового 64 кодируется строка. Был задан вопрос о том, следует ли использовать HMACSHA256, HMACSHA384 или HMACSHA512 для хэш-значения.

  • В чем преимущества использования HMACSHA512 по сравнению с HMACSHA256?
  • Является ли это значительно более безопасным?
  • Имеются ли существенные последствия для работы при использовании более длинного ключа?

В качестве побочного примечания; значение decodedKey, которое я передаю в конструктор, должно быть 512-битным ключом, если я использую HMACSHA512?

+1

[страница wikipedia] (http://en.wikipedia.org/wiki/SHA-2#Comparison_of_SHA_functions) имеет некоторые контрольные показатели производительности для них. – jbabey

ответ

15

Чтобы увидеть силу самих хеш-методов, пожалуйста, взгляните на keylength.com website. Вы увидите, что даже SHA-256 имеет довольно большой запас прочности.

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


Теперь скорость хэша зависит от среды выполнения. Но в целом вы можете сделать следующие предположения:

  1. SHA-1 обычно быстрее, чем любая реализация SHA-2 на той же платформе;
  2. SHA-512 работает быстрее, чем SHA-256 на 64-битных машинах (поскольку они используют внутреннюю 64-битную арифметику);
  3. SHA-256 работает быстрее, чем SHA-512 на 8, 16 и 32-битных машинах.

Используйте SHA-1, если вы ожидаете проблем с совместимостью. В противном случае вы можете также перейти на SHA-512 (и сократить результат до разумного количества бит). Внутреннее состояние и более высокая безопасность SHA-512 могут быть небольшим преимуществом. Я столкнулся с проблемами, когда клиенты не принимали какую-либо форму SHA-1 из-за общих проблем с алгоритмом; другими словами, тот факт, что он не защищен вообще может препятствовать принятию.


Обратите внимание, что SHA-384 и менее хорошо известны SHA-512/256 и SHA-512/224 Методы хэш представляют собой особый вид SHA-512, сократить до 384, 256 и 224 выходных битов. Таким образом, скорость этих алгоритмов одинакова. Единственное различие, кроме размера вывода, заключается в том, что эти специальные формы используют внутренние значения. В противном случае SHA-512 разрезается до 384 бит так же безопасно и так же быстро, как SHA-512/384. Однако вы должны использовать SHA-384 для совместимости.


Размер входного ключа не зависит от основной хэш-функции. Ключ сначала XOR-masked, а затем хэшируется базовой хэш-функцией; хэш-алгоритмы могут принимать практически неограниченное количество данных в качестве входных данных.

Рекомендуется использовать размер ключа, который, по крайней мере, имеет размер используемого метода хеширования, в противном случае вы можете снизить маржу безопасности, предоставляемую методом HMAC. Может быть незначительное снижение производительности, если размер ключа заставляет хэш-алгоритм хешировать несколько блоков.


Вы также можете использовать (предстоящий) стандарт SHA-3 в том смысле, что он будет безопасным. HMAC-SHA-3 в настоящее время не имеет особого смысла. HMAC на самом деле переполнена для SHA-3 (Keccak); SHA-3 должен быть безопасным даже без конструкции HMAC. [Редактировать] К настоящему времени KMAC стандартизирован как конструкция MAC для SHA-3.

Кроме того, конструкции SHA-2 - несколько удивительно - продемонстрировали довольно хорошую устойчивость против криптоанализа во время соревнований SHA-3. Поэтому нет необходимости в обновлении до SHA-3.

4

Я не думаю, что вам нужно беспокоиться о преимуществах безопасности, HmacSha1 по-прежнему считается secure, и безопасность следует рассматривать как относительно длины ключа. Производительность Sha256 vs Sha512 будет зависеть от реализации, платформы и т. Д., Вам придется протестировать себя. И длины ключей, которые вы предоставляете HMAC, не зависят от алгоритма хеширования, см. pseudocode.

+0

Документ переходов NIST (http://csrc.nist.gov/publications/nistpubs/800-131A/sp800-131A.pdf), Таблица 9: Переходы функции Hash запрещают SHA-1 для определенных видов использования после 2013 года, включая цифровые подписи. SHA-1 все еще может быть приемлемым для использования HMAC, но SHA-2 широко доступен и не устарел для любых соображений безопасности. Насколько вам удобнее как разработчик с использованием алгоритма безопасности, который постепенно прекращается из-за его предполагаемой слабости? – ingyhere

+0

Я не рекомендовал использовать HMACSHA1, я приводил его в качестве примера, чтобы не беспокоиться о безопасности HMACSHA512 против HMACSHA256 и сосредоточиться на ключевой длине. – jbtule

0

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