次のコードで HMACSHA256 を使用して、キー付き SHA256 ハッシュを作成しています。
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 が、それ自体が FIPS に準拠していない基礎となる SHA256Managed 実装を使用しているためです。
MSDN ドキュメントを検索すると、KeyedHashAlgorithm の SHA256 実装は HMACSHA256 だけであることがわかりました。
キー付き SHA256 ハッシュを使用して Web サービス要求に署名する必要があり (そのため、ハッシュ タイプを変更できません)、FIPS 対応環境で実行できる必要があります。
グーグルは、SHA256CryptoServiceProvider と SHA256Cng の両方が SHA256 ハッシュを作成するための FIPS 準拠の方法であることを示していますが、どちらもキー付きハッシュの作成をサポートしていないようです。