据我了解,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),有两种类型的加密:已验证和未验证。 “合规”没有任何意义(“符合”、“批准”、“等效”等也没有)。
您的应用将使用经过验证的加密,或者它不会使用经过验证的加密。如果您声明您的应用正在使用“兼容”加密,那么它不使用经过验证的加密。这是一个典型的营销错误: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 and FIPS 140-2 Cryptographic Modules 查找它们。
我在我的项目中使用符合 FIPS 标准的 OpenSSL 库
根据stackoverflow链接
您还应该尝试 OpenSSL 的 wiki:FIPS Library and Android。
为了完整起见,您不能将 Android 的构建系统用于 OpenSSL,然后声明经过 FIPS 验证的加密。它与安全政策中公布的程序完全不同,因此它使验证无效。
根据 Android 文档的 FIPS OpenSSL 模块,
该模块已在 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 构建了我的项目库
库即 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 时,将通过 HMAC 验证 FIPS 相关代码和数据的完整性,然后执行 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中找到说明。