.NET程序与FIPS兼容性问题

开始之前,先介绍一下术语:

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不兼容的问题。

或许,你还可以参考这两篇文章:

FIPS definition from wikipedia

Working with FIPS in .NET C#

支持原创技术分享,据说打赏我的人,都找到了女朋友!