【发布时间】:2019-04-11 09:23:11
【问题描述】:
首先我验证我的 openssl 是否正确(编译时支持 FIPS)。
# openssl version
OpenSSL 1.0.2q-fips 20 Nov 2018
正常模式下:
# echo -n 123456 | openssl md5
(stdin)= e10adc3949ba59abbe56e057f20f883e
在 FIPS 模式下:
# echo -n 123456 | OPENSSL_FIPS=1 openssl md5
Error setting digest md5
139993634896640:error:060A80A3:digital envelope routines:FIPS_DIGESTINIT:disabled for fips:fips_md.c:180:
正如预期的那样。
现在我想验证 python 的行为是否也符合预期。
我已经编译了支持 FIPS 模式的 python 3.6:
# ./python
Python 3.6.8 (tags/v3.6.8-dirty:3c6b436a57, Apr 11 2019, 08:44:38)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 1.0.2q-fips 20 Nov 2018'
我将其设置为 FIPS 模式:
>>> import ssl
>>> ssl.FIPS_mode_set(1)
>>> ssl.FIPS_mode()
1
现在我尝试验证它是否在 FIPS 模式下运行:
>>> import hashlib
>>>
>>> m = hashlib.md5()
>>> m.update(b"Nobody inspects")
>>> m.digest()
b'>\xf7)\xcc\xf0\xccV\x07\x9c\xa5F\xd5\x80\x83\xdc\x12'
为什么在 FIPS 模式下允许 md5?
编辑
我已经验证python正在使用openssl实现:
>>> hashlib.md5
<built-in function openssl_md5>
【问题讨论】:
-
'因为
hashlib与ssl关系不大...? -
md5()通常也可用,但如果您使用的是罕见的“符合 FIPS 标准”的 Python 版本,它可能会丢失。 – 您无法切换具有运行时设置的“符合 FIPS 的构建”。 -
@deceze hashlib 使用 openssl 实现(如果可用,我的系统就是这种情况)。在 FIPS 模式下运行,openssl 将拒绝执行 md5。因此,python md5 也应该失败。
-
@deceze 这里是相关的代码:github.com/python/cpython/blob/3.6/Lib/hashlib.py#L159
-
不过,
md5在__always_supported列表中,并且似乎不依赖于任何ssl运行时设置...
标签: python python-3.x openssl fips