我怎么知道hashlib.md5是否支持'usedforsecurity'标志?

时间:2019-02-15 22:26:43

标签: python c security md5 libcrypto

在Macbook上运行以下命令时,出现错误消息:

>>> import hashlib
>>> hashlib.md5(usedforsecurity=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: openssl_md5() takes no keyword arguments

但是当我在Linux机器上运行它时,它就可以工作!

>>> import hashlib
>>> hashlib.md5(usedforsecurity=False)
<md5 HASH object @ 0x7f763c1375d0>

我的问题是,我需要在启用FIPS的系统上运行一些安全的,与安全无关的代码(例如,管理用户请求的缓存,该请求会将用户查询哈希为MD5字符串)。使用usedforsecurity标志可防止FIPs异常。

这很好用,除非我要在Macbook上测试代码。我的Macbook的“ libcrypto”库显然不支持此usedforsecurity标志。是否有很好的方法来检测hashlib.md5之后的基础C绑定是否支持此标志?

3 个答案:

答案 0 :(得分:1)

我在FIPS和hashlib.md5()中遇到了相同的问题,但是我能够执行以下操作来检查:

>>> import hashlib, inspect
>>> inspect.getargspec(hashlib.new)
ArgSpec(args=['name', 'string', 'usedforsecurity'], varargs=None, keywords=None, defaults=('', True))

在Python 3+上,getargspec已过时,因此应改用getfullargspec。数据结构类似,但是usedforsecurity现在在kwonlyargs字段中。

>>> inspect.getfullargspec(hashlib.new)
FullArgSpec(args=['name', 'data'], varargs=None, varkw='kwargs', defaults=(b'',), kwonlyargs=['usedforsecurity'], kwonlydefaults={'usedforsecurity': True}, annotations={})

答案 1 :(得分:1)

为了扩展 Tim 的答案,如果您使用 hashlib.new('md5', usedforsecurity=False) 代替 hashlib.md5(usedforsecurity=False),即使不支持关键字参数,也不会引发异常。

答案 2 :(得分:0)

无法显式检查C绑定是否具有特定的关键字参数:

foverlaps(positions, segments) [
    , .(count = sum(!is.na(segment.start))), by = .(chr, pos, pos2) ][
    , pos2 := NULL ]
#     chr     pos count
#  1:   1  750000     1
#  2:   1  806000     1
#  3:   1  862000     1
#  4:   1  918000     1
#  5:   1  974000     1
#  6:   1 1030000     0
#  7:   1 1086000     0
#  8:   1 1142000     0
#  9:   1 1198000     0
# 10:   1 1254000     0
# 11:   1 1310000     0
# 12:   1 1366000     0
# 13:   1 1422000     0
# 14:   1 1478000     0
# 15:   1 1534000     0
# 16:   1 1590000     0
# 17:   1 1646000     0
# 18:   1 1702000     0
# 19:   1 1758000     1
# 20:   1 1814000     1
# 21:   1 1870000     1
# 22:   1 1926000     1
# 23:   1 1982000     1
#     chr     pos count

使用try / except是我能想到的最好的方法:

>>> import inspect
>>> inspect.getargspec(hashlib.md5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/inspect.py", line 815, in getargspec
    raise TypeError('{!r} is not a Python function'.format(func))
TypeError: <built-in function openssl_md5> is not a Python function