在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绑定是否支持此标志?
答案 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