开始之前,先介绍一下术语:
FIPS,全称是Federal Information Processing Standard,中文名叫联邦信息处理标准,FIPS 是由两个政府主体开发的标准。一个是美国国家标准和在美国境内的技术。另一种是通信安全机构,在加拿大。FIPS 是建议或要求使用 (美国或加拿大) 的联邦政府操作 IT 系统中的标准。
FIPS 140-2,主要用来定义安全级别,整个FIPS 140-2分为四个安全级别,它主要定义了一些和安全相关的策略,包括指定哪些加密算法和可使用的哈希算法和加密密钥的生成和管理的方式。
故事从这里开始,最近在做公司项目的时候,遇到一个很怪异的问题。我们的一个模块在普通的操作系统上,能正常运行,但是在启用了FIPS策略的机器上,就挂了。刚开始,还以为是其他原因,后来终于真相大白,这个bug和FIPS的安全策略有关。后来才知道,这个bug和US gov定义的这个安全策略那是相当的有基情!
前面已经提到,FIPS中有对加密算法的严格要求,总的来说,有些算法是FIPS允许的,有些是不允许的。而我的一个模块,恰恰用到了一个不兼容FIPS的加密算法,刚刚撞在了枪口上。悲剧啊⋯⋯
不过还是要感谢google老师,在搜索了一上午后,终于找到了解决办法:
第一种,是在.NET的配置文件的runtime节点中,加入如下节点:
<runtime>
<enforcefipspolicy enabled="false"></enforcefipspolicy>
</runtime>
通过把enforceFIPSPolicy强行设置为false,从而避过FIPS的策略检查
第二种方法,当然是顺从FIPS的策略,选择一种FIPS兼容的加密算法。下面是FIPS对各种加密算法的兼容性测试结果:
FIPS Compliant in mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Name Compliant Subclass
DESCryptoServiceProvider Y SymmetricAlgorithm
DSACryptoServiceProvider Y AsymmetricAlgorithm
HMACMD5 N HashAlgorithm
HMACRIPEMD160 N HashAlgorithm
HMACSHA1 Y HashAlgorithm
HMACSHA256 N HashAlgorithm
HMACSHA384 N HashAlgorithm
HMACSHA512 N HashAlgorithm
MACTripleDES Y HashAlgorithm
MD5CryptoServiceProvider N HashAlgorithm
RC2CryptoServiceProvider N SymmetricAlgorithm
RIPEMD160Managed N HashAlgorithm
RSACryptoServiceProvider Y AsymmetricAlgorithm
RijndaelManaged N SymmetricAlgorithm
SHA1CryptoServiceProvider Y HashAlgorithm
SHA1Managed N HashAlgorithm
SHA256Managed N HashAlgorithm
SHA384Managed N HashAlgorithm
SHA512Managed N HashAlgorithm
TripleDESCryptoServiceProvider Y SymmetricAlgorithm
FIPS Compliant in System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Name Compliant Subclass
AesCryptoServiceProvider Y SymmetricAlgorithm
AesManaged N SymmetricAlgorithm
ECDiffieHellmanCng Y AsymmetricAlgorithm
ECDsaCng Y AsymmetricAlgorithm
MD5Cng N HashAlgorithm
SHA1Cng Y HashAlgorithm
SHA256Cng Y HashAlgorithm
SHA256CryptoServiceProvider Y HashAlgorithm
SHA384Cng Y HashAlgorithm
SHA384CryptoServiceProvider Y HashAlgorithm
SHA512Cng Y HashAlgorithm
SHA512CryptoServiceProvider Y HashAlgorithm
有了这个结果,就目标很明确了,选择一种与FIPS兼容的算法,即可一劳永逸,解决你的程序与FIPS不兼容的问题。
或许,你还可以参考这两篇文章: