我的Android项目的FIPS合规性

时间:2013-06-14 07:13:00

标签: android openssl fips

我正在开展与安全相关的项目,并且必须确保它符合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吗?

请赐教。

1 个答案:

答案 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,因此您必须:

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

  

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

您无法在静态库上运行fipsldincore,因此听起来有些不对劲。它们只能在可执行文件和共享对象上运行。 fipsldincore一起工作,并将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。它讨论了如何设置CCFIPSCC_LD所以fipsldincore"只是工作"当make关注您的项目时。

没有相应的iOS页面。但您可以在OpenSSL FIPS User Guide 2.0附录E中找到该说明。