当前位置: 首页 > 面试题库 >

如何检查OpenSSL中的FIPS 140-2支持?

景宏富
2023-03-14
问题内容

我们有一个客户正在询问有关OpenSSL FIPS (Federal Information Processing Standard) 140-2
兼容支持的 验证密码用法。如何检查OpenSSL是否 具有FIPS抱怨 是否提供了FIPS验证的加密?

作业系统: Redhat 5 Linux


问题答案:

如何检查OpenSSL是否提供了FIPS验证的加密?

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

FIPS可能可用,但未使用。因此,应用程序必须通过启用验证密码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但是,这并不意味着应用程序正在使用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共享对象

$ 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

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

更新 :我将关于主题的幻灯片放到了OpenSSL
Wiki。其称为使用OpenSSL验证密码学构建应用程序:开发人员和审计人员的现场说明。您将需要从幻灯片18开始复习材料。

我为OWASP构建了幻灯片平台,但是没有兴趣接收它。我知道Stack Overflow不赞成OpenSSL
Wiki上的链接,但是我不知道如何在此处提供35张以上的幻灯片。



 类似资料:
  • 我正在使用openssl检查是否存在tlsv1。3是否支持域列表。我已经编写了脚本,但脚本没有停止,它会等待我按CTRL D键,然后给我一个结果。这是scirpt 我还将echo与openssl结合使用,如下所示 注意:当我在终端上为单个站点运行命令时,我得到的结果没有键入CRTL D,但当我在脚本中使用loop和if语句时,它会等待我按下CTRL D。这真的很奇怪。 我还尝试了echo“q”|

  • 我有http://laws-lois.justice.gc.ca/pdf/a-8.8.pdf,我正在尝试使用有两个列的PDFBox解析它。我希望对文本进行解析,以便将两列分开,但是当我通过PDFBox运行它时,它并没有将两列分开,而是将两列中的行连接在一起。 我读过https://issues.apache.org/jira/browse/pdfbox-448,上面说有些PDF没有可以使用的文章/

  • 问题内容: 我需要检查服务器是否支持SSL和来自Web服务器的密码。 我查看了Java中的SSLSocket,但无法正常工作。 我使用的方法始终为每个网址提供相同的协议。此外,我没有从服务器获得密码。我猜是正确的方法 如何检查服务器使用SSL?服务器返回了什么密码? 问题答案: 分别返回 您一方 可以支持的协议和密码列表。返回您启用的这些列表的子集。 这不会告诉您有关服务器支持什么的太多信息。 根

  • 问题内容: 我们正在使用注册自己的协议的软件。我们可以从浏览器运行应用程序,然后通过如下链接: 但是有没有办法检查用户系统是否支持这种自定义协议?如果不是,我们想请用户先安装软件。 例如: 编辑 我知道关于protocolLong属性,但是它仅在IE中有效。 问题答案: 不幸的是,没有简单的方法来实现这一目标。当然,没有预先确定是否安装协议处理程序的方法。 *正如您所提到的, *Internet

  • 我必须从remore服务器检索并下载本地环境证书链。我可以使用浏览器嵌入式服务来实现,但据我所知,这种方法对证书链不起作用(或者有一些瓶颈)。这就是我试图使用openssl以下命令的原因: 它将打印出相应的证书信息,如: 我怎样才能将它转换为.crt或.cer格式?我可以只复制/粘贴到文本文件的适当扩展名吗?如果是,链的起点和终点在哪里?

  • 问题内容: 如何检查两个线段L1(p1,p2)和L2(p3,p4)是否相交?我不需要相交点,我只需要知道它们是否相交即可。由于我的应用程序对此进行了大量计算,因此我需要找到一个快速的解决方案。 谢谢 问题答案: 要测试两个线段是否相交,可以使用Java的2D API,特别是Line2D的方法。 如果您有兴趣了解代码的工作方式,以便查看是否可以在特定域中更快地进行编码,可以查看OpenJDK实现的代