Существует ли хэш-алгоритм SHA256 с ключом, совместимый с FIPS для .NET?

Я создаю хэш SHA256 с ключом, используя HMACSHA256 со следующим кодом:

HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey);
byte[] hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(data));

string hashResult = string.Empty;
for (int i = 0; i < hash.Length; i++)
{
    hashResult += hash[i].ToString("x2"); // hex format
}

Это работает просто отлично, однако в среде с поддержкой FIPS происходит сбой, поскольку HMACSHA256 использует базовую реализацию SHA256Managed, которая сама по себе не совместима с FIPS.

Просматривая документацию MSDN, я обнаружил, что единственной реализацией SHA256 KeyedHashAlgorithm является HMACSHA256.

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

Поиск в Google показывает, что и SHA256CryptoServiceProvider, и SHA256Cng являются совместимыми с FIPS способами создания хэшей SHA256, но ни один из них не поддерживает создание хэшей с ключами.


person hubiggo    schedule 25.07.2013    source источник


Ответы (3)


Нет, нет. Здесь приведен список тех, которые (прокрутите вниз до раздела FIPS.sys Algorithms ).

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

person SwDevMan81    schedule 25.07.2013
comment
Как указывает метаобсуждение , ваш ответ должен быть более содержательным, чем просто ссылка. - person neontapir; 25.07.2013
comment
@neontapir - Ответ на вопрос - нет, так что, на мой взгляд, что-то большее :) - person SwDevMan81; 25.07.2013
comment
Я имел в виду, что мне нужно было перейти по ссылкам в вашем ответе, чтобы увидеть, какой обходной путь и возможное решение вы имели в виду. Опасность в том, что ссылки устаревают и тогда ответ становится бесполезным. - person neontapir; 25.07.2013
comment
Я понимаю аргументацию, но этот ответ не будет бесполезен без ссылок. Я добавляю их, чтобы дать больше контента, чем просто No - person SwDevMan81; 25.07.2013
comment
FIPS.sys предназначен для компонентов ядра, но этот парень работает в пользовательской среде с .Net. Я думаю, что у него больше возможностей, чем кажется. Например, расширенный поставщик RSA (RSAENH) доступен на старых платформах, а новые платформы имеют алгоритмы Bcrypt и поставщика CNG (не знаю, как упоминается CNG...). - person jww; 01.02.2014

Я знаю, что это старо, но похоже, что Microsoft решила эту проблему. Я использую .NET 4.5.1 в Windows 8. Я не могу сказать, в какой версии BCL это было исправлено или в ОС.

this.m_hash1 = HMAC.GetHashAlgorithmWithFipsFallback((Func<HashAlgorithm>) (() => (HashAlgorithm) new SHA256Managed()), (Func<HashAlgorithm>) (() => HashAlgorithm.Create("System.Security.Cryptography.SHA256CryptoServiceProvider")));
person Daniel    schedule 03.07.2014
comment
Я просто хотел бы согласиться с вашим наблюдением. Я включил FIPS на Windows 8.1 и Windows7 SP1. Классы HMACSHA512, HMACSHA256 работают нормально. Я запустил следующий код на обеих платформах. HMACSHA26 и HMAC512 не работают в .NET 3.5, но проходят в .Net 4.0 и выше. - person Ehsan Samani; 04.05.2015

Официально вам может не повезти, но построить HMAC_SHA256 из SHA-256 должно быть относительно легко. Просто взгляните на страницу Википедии, чтобы убедиться, насколько это просто.

Обратите внимание, что HMAC может быть не одобрен в режиме FIPS, поскольку он уязвим для атак по сторонним каналам. В этом случае вы должны убедиться, что есть какая-то защита от атак по сторонним каналам.

Немного опасно создавать собственные криптоалгоритмы из криптографических примитивов. Если вы сами попытаетесь заявить о безопасности на уровне FIPS, это может стать проблемой. Но для большинства пользователей достаточно, если вы скажете, что используете только алгоритмы, совместимые с NIST. Вам решать, как далеко вы готовы зайти вниз по этой линии...

person Maarten Bodewes    schedule 26.07.2013