Я создаю хэш 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, но ни один из них не поддерживает создание хэшей с ключами.