10

我正在从事与安全相关的项目,并且必须确保它符合 FIPS 合规性。

据我了解,FIPS 合规性是硬件和软件级别的合规性。目前有 2 款符合 FIPS 标准的三星 Android 设备,即它们在硬件和软件级别都符合标准。我有几个问题如下: -

1)如果我想让我的 Android 应用程序符合 FIPS 标准,如果我的项目中使用的唯一加密模块符合 FIPS 标准,是否足够?

Android SDK 提供的加密模块是 BouncyCastle 库,它不符合 FIPS。

根据 stackoverflow链接,我在我的项目中使用符合 FIPS 的 OpenSSL 库

我已经使用 OpenSSL 库构建了我的项目库,即使用 FIPS 模块配置的 libssl.a 和 libcrypto.a。

2) 根据 FIPS OpenSSL module for Android文档,该模块已在 armv7 架构的不同 Android 设备上进行了测试。Android 硬件不符合 FIPS 的问题在这里吗?

3) AES 算法符合 FIPS。这是否意味着如果我在 Java 代码中使用 AES 算法而不是使用符合 FIPS 的 OpenSSL 库,则它不符合 FIPS。

如果 AES 符合 FIPS 规范,那么它与 AES 的 Java 或 C# 实现有什么关系。他们都必须通过 CMVP 吗?

请赐教。

4

1 回答 1

15

据我了解,FIPS 合规性是硬件和软件级别的合规性。

FIPS 140-2 是一个以硬件为中心的大型文档。编写要求的人是制造硬件的电气工程师。例如,Randy Easter 博士运行加密模块验证程序 (CMVP)。这是他的简短简历:http ://www.nist.gov/itl/csd/easter-randy.cfm 。他肯定是双E;)

当 NIST 和 CMVP 将要求重新安装到软件时,他们将一个方形钉子敲入一个圆孔。你会发现很多在软件环境中完全没有意义的东西。例如,OpenSSL(和其他经过 FIPS 验证的库)存储 HMAC(对称)密钥以验证软件本身的软件完整性。(当密钥被烧入 rom、保险丝熔断、防篡改 PCB 和防篡改外壳中时,情况大不相同)。

为了完整起见,您可以在FIPS PUB 140-2 实施指南和加密模块验证程序中找到已批准的完整性测试方法。它们确实包括 CMAC 和 HMAC。


... Android 应用 FIPS 兼容 ...

第一件事:)

根据密码模块验证程序 (CMVP),有两种类型的密码:已验证和未验证。“合规”没有任何意义(“符合”、“批准”、“等效”等也没有)。

您的应用将使用经过验证的加密,或者它不会使用经过验证的加密。如果您声明您的应用正在使用“兼容”加密,那么它没有使用经过验证的加密。这是一个典型的营销错误:http ://webdrive.com/support/webdrive/v11/fips_compliance.htm 。

我知道 DHS 将一堆交换机从联邦撤出,因为交换机制造商的营销部门称它们为“符合 FIPS 标准”而不是“经过 FIPS 验证”。


1) 如果我想让我的 Android 应用程序符合 FIPS,如果我的项目中使用的唯一加密模块符合 FIPS,是否足够?

没有。这个编号有两个部分。首先是程序性的,它在模块的安全策略中列出。例如,OpenSSL 有一个从源代码构建它的过程,您不能偏离这些过程。

第二个是使用(没有更好的术语),它要求您遵守 FIPS 140-2 操作要求。例如,在发送使用 AES 加密的消息时,您不能重复使用密钥和 ivs。

两者兼而有之:您必须调用FIPS_mode_set,并且它必须返回非零。调用失败FIPS_mode_set是一个程序错误,意味着您没有使用经过验证的密码学。失败FIPS_mode_set是一个操作错误,意味着您没有使用经过验证的密码学。

如果您使用的是 OpenSSL,您还应该在数据表中包含“供应商确认”,并引用 1747 证书。我相信这是安全策略的要求,而未能提供它意味着您的密码学未经验证!


Android SDK 提供的加密模块是 BouncyCastle 库,它不符合 FIPS。

我不使用充气城堡,所以我不知道它的状态。如果库已经过验证,那么就会有 CMVP 颁发的证书。您可以在Validated FIPS 140-1 和 FIPS 140-2 Cryptographic Modules中查找它们。


根据 stackoverflow 链接,我在我的项目中使用符合 FIPS 的 OpenSSL 库

您还应该尝试 OpenSSL 的 wiki:FIPS 库和 Android

为了完整起见,您不能将 Android 的构建系统用于 OpenSSL,然后声明经过 FIPS 验证的加密。它与安全策略中发布的程序完全不同,因此它使验证无效。


根据 FIPS OpenSSL module for Android 文档,该模块已在 armv7 架构的不同 Android 设备上进行了测试。

这是一个难以解开的领域。Steve Marquess 试图在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,因此您必须:

  • 在 Android 和 Java 下,使用 JNI 并调用共享对象。共享对象必须提供 OpenSSL 的 FIPS 验证加密。
  • 在 C# 下,使用 P/Invoke 或 Inerop 并调用动态链接库。动态链接库必须提供 OpenSSL 的 FIPS 验证加密。

我已经使用 OpenSSL 库构建了我的项目库,即使用 FIPS 模块配置的 libssl.a 和 libcrypto.a。

您不能在静态库上运行fipsld和运行incore,所以听起来好像有问题。它们只能在可执行文件和共享对象上运行。fipsld协同工作,incore将 FIPS 相关代码和数据的签名嵌入到您的可执行文件、共享库或应用程序中。FIPS 相关的代码和数据来自 (1)fipscanister.o和 (2) fips_premain.c

为了让它完整循环,fipsld编译fips_premain.c并链接fipscanister.o到您的可执行文件、共享对象或应用程序。然后incore将签名写入您的可执行文件、共享对象或应用程序。当您调用 时FIPS_mode_set,将通过 HMAC 验证 FIPS 相关代码和数据的完整性,然后执行 FIPS 相关自检。如果全部成功,则FIPS_mode_set返回非零值,并且您正在使用 FIPS 验证加密。

作为参考,OpenSSL 在此处提供了一个 wiki 页面:FIPS 库和 Android。它讨论了如何设置CCFIPSCC_LDfipsld并且在你的项目中incore “正常工作” 。make

没有等效的 iOS 页面。但是您可以在OpenSSL FIPS 用户指南 2.0的附录 E中找到说明。

于 2013-12-02T02:42:20.483 回答