我正在寻找符合FIPS标准的C#中的SHA256实现。事实证明SHA1CryptoServiceProvider工作。但是为什么SHA256CryptoServiceProvider会跳过
{"This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms."}
错误?好像它应该只是工作。
var sha = System.Security.Cryptography.SHA256CryptoServiceProvider.Create(); // not FIPS
在这种情况下,我使用的是.NET 4.5,但同样的事情发生在3.5和4.0中。我认为SHA256CryptoServiceProvider是符合FIPS标准的SHA256Managed替代品。 SHA256Cng会抛出相同的错误。
更新。我想我需要制作一个“新的SHA256CryptoServiceProvider”,而不是使用Create()
答案 0 :(得分:2)
正如更新中建议的原始海报一样,解决方案是实际创建SHA256CryptoServiceProvider(或512)的新实例。调用Create将不起作用:
var csp = new SHA512CryptoServiceProvider();
byte[] hashedBytes = csp.ComputeHash(......);
String hashedText = Convert.ToBase64String(hashedBytes);
答案 1 :(得分:1)
没有SHA256CryptoServiceProvider.Create()
,但是有SHA256.Create()
:
在.NET Framework上,如果未激活FIPS模式,则此方法将创建SHA256Managed类的实例。如果激活了FIPS模式,它将创建SHA256Cng类的实例。
但是,有一个警告(也许是最初的问题):
在启用了FIPS的.NET 4.6.1和更低版本上,选择了
SHA256Managed
,它不符合FIPS。
如果要定位.NET <= 4.6.1,则可以使用以下方法:
public static SHA256 CreateSHA256()
{
try
{
return SHA256.Create();
}
catch (TargetInvocationException)
{
return SHA256CryptoServiceProvider.Create();
}
}