我正在开展与安全相关的项目,并且必须确保它符合FIPS标准。
根据我的理解,FIPS合规性是硬件和软件级别的合规性。目前有2款三星Android设备符合FIPS标准,即它们在硬件和软件级别都具有合规性。 我的问题如下: -
1)如果我想让我的Android应用程序符合FIPS标准,如果我在我的项目FIPS兼容中使用了唯一的加密模块,这还够吗?
Android SDK提供的加密模块是BouncyCastle库,它不符合FIPS标准。
我在我的项目中使用符合FIPS标准的OpenSSL库,如stackoverflow link
我使用OpenSSL库构建了我的项目库,即使用FIPS模块配置的libssl.a和libcrypto.a。
2)根据Android documentation的FIPS OpenSSL模块,该模块已经在armv7架构的不同Android设备上进行了测试。 Android硬件不符合FIPS标准吗?
3)AES算法符合FIPS标准。这是否意味着如果我在Java代码中使用AES算法而不是使用符合FIPS标准的OpenSSL库,那么它不符合FIPS标准。
如果AES符合FIPS标准,那么它与AES或C#的AES实现有什么关系。他们都必须通过CMVP吗?
请赐教。
答案 0 :(得分:11)
根据我的理解,FIPS合规性是硬件和软件级别的合规性。
FIPS 140-2是一个以硬件为中心的大文档。写这些要求的人是建造硬件的电气工程师。例如,Randy Easter博士运行加密模块验证程序(CMVP)。这是他简短的简历:http://www.nist.gov/itl/csd/easter-randy.cfm。他肯定是双E;)
当NIST和CMVP重新满足软件要求时,他们将一个方形钉子钉在圆孔上。你会发现许多在软件环境中毫无意义的东西。例如,OpenSSL(和其他FIPS验证的库)存储HMAC(对称)密钥以验证软件本身中软件的完整性。 (当密钥烧成rom,熔断器熔断,防篡改PCB和防篡改外壳时,它会有很多不同。)
为了完整起见,您可以在Implementation Guidance for FIPS PUB 140-2 and the Cryptographic Module Validation Program中找到经批准的完整性测试方法。他们确实包括CMAC和HMAC。
... Android应用符合FIPS ......
首先要做的事情是:)
根据加密模块验证程序(CMVP),有两种类型的加密:验证和未验证。 "符合"什么都不是(#34;符合","批准","等同"等)。
您的应用将使用经过验证的加密,或者它不会使用经过验证的加密。如果您声明您的应用正在使用"合规"加密,然后不使用验证加密。这是一个典型的营销错误:http://webdrive.com/support/webdrive/v11/fips_compliance.htm。
我知道DHS从联邦政府那里取出了一堆交换机,因为交换机制造商的营销部门称他们为“FIPS兼容"而不是" FIPS验证"。
1)如果我想让我的Android应用程序符合FIPS标准,如果我有 我的项目符合FIPS标准的唯一加密模块就足够了吗?
没有。这有两个部分。首先是程序性的,它在模块的安全策略中列出。例如,OpenSSL有一个从源代码构建它的过程,你不能偏离这些过程。
第二种是使用(缺少更好的术语),它要求您遵守FIPS 140-2操作要求。例如,在发送使用AES加密的邮件时,您无法重复使用密钥和iv。
属于两者的东西:你必须调用FIPS_mode_set
,它必须返回非零。未能调用FIPS_mode_set
是一个程序错误,意味着您没有使用经过验证的加密。 FIPS_mode_set
失败是一个操作错误,意味着您没有使用经过验证的加密。
如果您使用的是OpenSSL,则还应包括"供应商肯定"在您的数据表中,并引用1747证书。我认为这是安全政策的要求,如果没有提供,则意味着您的加密不验证!
Android SDK提供的加密模块是BouncyCastle 库,它不符合FIPS。
我不使用Bouncy Castle,所以我不知道它的状态。如果库已经过验证,那么CMVP将颁发证书。您可以在Validated FIPS 140-1 and FIPS 140-2 Cryptographic Modules查找它们。
我在我的项目中使用符合FIPS标准的OpenSSL库 根据stackoverflow链接
您还应该尝试使用OpenSSL的wiki:FIPS Library and Android。
为了完整起见,您不能使用Android的OpenSSL构建系统,然后声明FIPS验证的加密。它与安全政策中公布的程序完全不同,因此无效验证。
根据适用于Android文档的FIPS OpenSSL模块, 该模块已经在armv7的不同Android设备上进行了测试 架构。
这是一个难以解决的难题。史蒂夫马奎斯试图在OpenSSL FIPS 2.0 Object Module platform questions回答它。
这是我(可能不正确)的理解:一旦验证了平台,加密模块验证程序(CMVP)就可以容忍对平台的微小更改。我避开了什么样的平台"是,但它包括主板,处理器,指令集和其他操作影响。通常,它不包括运行时库等环境影响。
例如,Apple可以对带有A6处理器的iPad的主板进行微小修改(可能会改变其外形尺寸或提供改进的集成摄像头)。它甚至可以对A6处理器本身进行微小的修改(可能会增加缓存大小)。他们可以随心所欲地称呼它(IpAd 3,iPad 4,或者Fan Boi的任何痒痒)。但是,同一主板上的A7处理器需要进行另一次验证,因为它是一个重大修订。这同样适用于指令集:armv7和armv7s需要单独的验证。
作为另一个例子,考虑ARMv7处理器。使用ARMv7的Snapdragon处理器是与ARM Holdings公司的Classic ARM7EJ-S不同的平台。两者都需要单独的验证。 NEON是ARMv7,它有一个单独的验证(我认为它在ARMv7之上添加了一些多媒体指令)。
CMVP可以随时改变主意,并且不再容忍轻微的平台修改。
Android硬件不符合FIPS标准 无所谓
不,只要平台(包括硬件)之前已经过验证。如果平台之前未经过验证,那么它就是一个问题;)
3)AES算法符合FIPS标准。做这个 意味着如果我在Java代码中使用AES算法 使用符合FIPS标准的OpenSSL库,不是 符合FIPS标准。
正确。 Java代码未经过FIPS验证,因此您的应用程序无法使用FIPS验证的加密。
为了完整性,还有一个加密算法验证程序(CAVP)。 CAVP将通过颁发证书来签署AES实施。例如,OpenSSL的AES实施已颁发证书1884,2116,2234,2342,2394和2484。
最终,在其他NIST部门(例如CAVP)完成对模块的检查后,CMVP将在模块上签名(作为一个整体)并颁发证书。例如,NIST为OpenSSL颁发了证书1747。
如果AES符合FIPS标准,那么它与它有什么关系 AES或Java的C#实现。他们俩都必须通过 通过CMVP?
由于您使用的是FIPS验证的OpenSSL,因此您必须:
我使用OpenSSL构建了我的项目库 库,即libssl.a和libcrypto.a配置 使用FIPS模块。
您无法在静态库上运行fipsld
和incore
,因此听起来有些不对劲。它们只能在可执行文件和共享对象上运行。 fipsld
和incore
一起工作,并将FIPS相关代码和数据的签名嵌入到您的可执行文件,共享库或应用程序中。与FIPS相关的代码和数据来自(1)fipscanister.o
和(2)fips_premain.c
。
要完整循环,fipsld
编译fips_premain.c
并将fipscanister.o
中的链接指向您的可执行文件,共享对象或应用。然后incore
将签名写入您的可执行文件,共享对象或应用程序。当您调用FIPS_mode_set
时,FIPS相关代码的完整性通过HMAC验证数据,然后执行与FIPS相关的自检。如果全部成功,则FIPS_mode_set
返回非零,并且您正在使用FIPS验证的加密。
作为参考,OpenSSL在此处提供了一个wiki页面:FIPS Library and Android。它讨论了如何设置CC
和FIPSCC_LD
所以fipsld
和incore
"只是工作"当make
关注您的项目时。
没有相应的iOS页面。但您可以在OpenSSL FIPS User Guide 2.0附录E中找到该说明。