我们有一个客户询问 OpenSSL FIPS (Federal Information Processing Standard) 140-2 兼容支持验证的加密使用。如何检查 OpenSSL 是否有 FIPS 提示是否提供 FIPS 验证的加密?

操作系统:Redhat 5 Linux

最佳答案



这取决于您要检查的方式和时间。这也取决于应用程序。

FIPS 可能可用但未使用。因此,应用程序必须通过 FIPS_mode_set 启用经过验证的加密,并且调用必须成功。

如果要检查 FIPS Capable Library(例如 OpenSSL 1.0.1e)是否配置为使用 FIPS 对象模块,则可以:

$ cat /usr/local/ssl/include/openssl/opensslconf.h  | grep -A 2 -i fips
#ifndef OPENSSL_FIPS
# define OPENSSL_FIPS
#endif
OPENSSL_FIPS 告诉您 FIPS Capable Library 被配置为使用 FIPS Object Module。因此 FIPS 验证的密码学是可用的。

但是,OPENSSL_FIPS 并不意味着应用程序正在使用 FIPS 验证的加密。应用程序必须调用 FIPS_mode_set ,函数必须返回成功。

在运行时,您可以打印与以下内容关联的字符串(取自我专门为此使用的代码):
ostringstream oss;
oss << OPENSSL_VERSION_TEXT;
LogVersion(oss.str().c_str());

该代码将生成类似于以下内容的日志条目:
Version: OpenSSL 1.0.1f-fips 6 Jan 2014

您可以使用一些技巧来审核模块。例如,如果可执行文件是真正的 FIPS,下面将测试一些必须存在的符号。

在这种情况下,我正在测试 OpenSSL FIPS Capable 共享对象。如果应用程序链接到 libcrypto.a ,那么您可以审核程序而不是 OpenSSL 共享对象。
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_*
00000000000c7f60 T ERR_load_FIPS_strings
00000000000c2250 T FIPS_add_error_data
00000000000c3900 T FIPS_add_lock
0000000000082820 T FIPS_bn_bin2bn
0000000000082980 T FIPS_bn_bn2bin
0000000000082760 T FIPS_bn_clear
0000000000082350 T FIPS_bn_clear_free
00000000000823d0 T FIPS_bn_free
0000000000087c90 T FIPS_bn_generate_prime_ex
0000000000082790 T FIPS_bn_get_word
0000000000082d20 T FIPS_bn_is_bit_set
0000000000087c80 T FIPS_bn_is_prime_ex
0000000000087750 T FIPS_bn_is_prime_fasttest_ex
...

您还有来自 fips_premain.c 的符号:
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_text_*
00000000000c4520 T FIPS_text_end
000000000007b340 T FIPS_text_start
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_rodata*
00000000001e1e20 R FIPS_rodata_end
00000000001d8ce0 R FIPS_rodata_start
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_signature*
00000000004696c0 B FIPS_signature
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_incore*
000000000007b5a0 T FIPS_incore_fingerprint

现在,这真的是偷偷摸摸。您可以检查模块是否包含自检。例如,fips_drbg_selftest.h 将包括以下字节的自检:
0x2e,0xbf,0x98,0xf9,0x85,0x27,0x8b,0xff,0x36,0xb9,0x40,0x0b,
0xc0,0xa1,0xa0,0x13,0x20,0x06,0xcc,0xe6,0x2a,0x03,0x77,0x7d,
0xee,0xde,0xcc,0x34,0xe3,0xcd,0x77,0xea,0xd0,0x3e,0xbe,0xdd,
0xf6,0x15,0xfb,0xa7,0xd7,0x8e,0xd0,0x2e,0x2f,0x82,0x4c,0xc7,
0x87,0xb1,0x6f,0xc5,0xf8,0x5c,0x78,0xde,0x77,0x9b,0x15,0x9a,
0xb9,0x3c,0x38

您可以验证开发人员在其可执行文件上运行 incoremacho_incore 以通过转储符号 FIPS_signature 的 20 个字节来嵌入 FIPS 指纹。如果它的 20 个字节是 0(默认为 fips_premain.c ),则指纹未嵌入并且 FIPS_mode_set 将失败。所以在这种情况下不可能使用 FIPS 验证的加密。

更新 :我将有关该主题的幻灯片上传到 OpenSSL wiki。它被称为 Building Applications using OpenSSL Validated Cryptography: Notes from the Field for Developers and Auditors 。您需要从幻灯片 18 左右开始复习 Material 。

我为 OWASP 制作了幻灯片,但没有兴趣接收它。我知道 Stack Overflow 不喜欢 OpenSSL wiki 上的链接,但我不知道如何在此处提供 35+ 幻灯片。

关于linux - 如何在 OpenSSL 中检查 FIPS 140-2 支持?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18616573/

10-13 07:21