4

当我在我的 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标志可防止 FIP 异常。

这很好用,除非我想在我的 Macbook 上测试我的代码。我的 Macbook 的“libcrypto”库显然不支持这个usedforsecurity标志。有没有一种好方法来检测背后的底层 C 绑定是否hashlib.md5支持这个标志?

4

3 回答 3

2

我在使用 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={})
于 2020-02-20T14:39:09.420 回答
1

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

>>> 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

这是我能想到的最好的,使用 try/except:

>>> import hashlib
>>> has_usedforsecurity_flag = False
>>> try:
...   hashlib.md5(usedforsecurity=False)
...   has_usedforsecurity_flag = True
... except Exception as e:
...   print e
...   # Doesn't have the flag.
...
<md5 HASH object @ 0x7f763c0b9bc0>
于 2019-02-15T22:31:59.610 回答
1

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

于 2021-01-17T22:30:30.863 回答