我有一系列与 FIPS 和 OpenSSL 相关的查询,因为我不太了解它。
您应该熟悉User Guide for the OpenSSL FIPS Object Module v2.0。
如果我的应用程序没有通过FIPS_mode_set() 明确设置 FIPS 模式,这是否意味着为我的应用程序设置了非 FIPS 模式并且不会使用经过 FIPS 140-2 验证的加密,即使它们在 OpenSSL 运行时可用?
有人必须使用非零值调用FIPS_mode_set(),并且调用必须成功。通常你这样称呼它。它基于用户指南中的示例,第 55 页:
#ifdef OPENSSL_FIPS
if(FIPS_mode_set(1))
{
fprintf(stdout,"FIPS validated cryptography\n");
}
else
{
ERR_load_crypto_strings();
ERR_print_errors_fp(stderr);
exit(1);
}
#endif
成功的调用意味着库通过了初始化自检并且它禁用了非 FIPS 算法。
如果 (1) 没有人使用非零值调用 FIPS_mode_set(),或 (2) 调用失败,那么您没有使用 FIPS 验证的加密。
如果 (1) 或 (2) 发生,所有密码仍然可用。它只是不会经过 FIPS 验证。
有什么方法可以交叉检查第三方二进制文件是否设置了 FIPS 模式
致电FIPS_mode() 或FIPS_module_mode()。如果它返回 0,那么您不是在 FIPS 模式下运行。如果返回非 0,则说明您处于 FIPS 模式。
根据用户指南第 55 页中的示例:
#ifdef OPENSSL_FIPS
if (FIPS_mode())
{
fprintf(stdout,"FIPS validated cryptography\n");
}
else
#endif
{
fprintf(stdout,"No FIPS validated cryptography\n");
}
您可能会遇到使用FIPS_mode() 等符号的一些痛点。那是因为您没有为 FIPS 配置和构建。所以像OPENSSL_FIPS 这样的预处理宏不会在你编译和链接你的程序时被定义。
在这种情况下,您可能需要dlopen 供应商提供的库,然后使用dlsym 找到符号。在 Windows 上,您将调用 LoadLibrary 和 GetProcAddress。手头有符号,可以间接调用FIPS_mode()。
另请参阅Dynamically Loaded (DL) Libraries HowTo 或搜索 Stack Overflow。