我们有一个客户正在询问有关OpenSSL FIPS (Federal Information Processing Standard) 140-2 兼容支持的 验证密码用法。如何检查OpenSSL是否 具有FIPS抱怨 是否提供了FIPS验证的加密?
FIPS (Federal Information Processing Standard) 140-2
作业系统: Redhat 5 Linux
Redhat 5 Linux
如何检查OpenSSL是否提供了FIPS验证的加密?
这取决于您要检查的方式和时间。它还取决于应用程序。
FIPS可能可用,但未使用。因此,应用程序必须通过启用验证密码FIPS_mode_set,并且调用 必须 成功。
FIPS_mode_set
如果要检查是否已将FIPS功能库(例如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对象模块。因此,可以使用经过FIPS验证的加密技术。
OPENSSL_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的共享对象。如果应用程序链接到libcrypto.a,那么您可以审核程序而不是OpenSSL共享对象。
libcrypto.a
$ 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:
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将对其自检包括以下字节:
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
您可以通过转储符号的20个字节来验证开发人员是否已运行incore或macho_incore在其可执行文件上嵌入FIPS指纹FIPS_signature。如果它的20个字节为0(默认为fips_premain.c),则指纹未嵌入并且FIPS_mode_set将失败。因此,在这种情况下不可能使用FIPS验证的密码学。
incore
macho_incore
FIPS_signature
更新 :我将关于主题的幻灯片放到了OpenSSL Wiki。其称为使用OpenSSL验证密码学构建应用程序:开发人员和审计人员的现场说明。您将需要从幻灯片18开始复习材料。
我为OWASP构建了幻灯片平台,但是没有兴趣接收它。我知道Stack Overflow不赞成OpenSSL Wiki上的链接,但是我不知道如何在此处提供35张以上的幻灯片。