【问题标题】:MD4 hashlib support in Python 3.8Python 3.8 中的 MD4 hashlib 支持
【发布时间】:2021-11-12 06:01:35
【问题描述】:

我正在尝试为使用 NTLM 身份验证的服务器实现一个肥皂客户端。我使用的库(requests-ntlm2 依赖于 ntlm-auth)通过标准库的 hashlib 实现位于 NTLM 协议核心的 MD4 算法。

虽然hashlib似乎支持MD4:

>>> import hashlib
>>> hashlib.algorithms_available
{'md5-sha1', 'md4', 'shake_128', 'md5', 'blake2s', 'sha3_512', 'ripemd160', 'sha512', 'mdc2', 'blake2b', 'sha3_256', 'sha3_224', 'sha512_224', 'sha1', 'sha384', 'sha256', 'sha224', 'whirlpool', 'sha512_256', 'sha3_384', 'shake_256', 'sm3'}
>>>

我系统中的 openssl 库也是如此:

(victory) C:\code\python\services>openssl
help:
[...]
Message Digest commands (see the `dgst' command for more details)
blake2b512        blake2s256        md4               md5
mdc2              rmd160            sha1              sha224
sha256            sha3-224          sha3-256          sha3-384
sha3-512          sha384            sha512            sha512-224
sha512-256        shake128          shake256          sm3
[...]

当身份验证尝试运行 python 时会产生 ValueError: unsupported hash type md4 错误。以下是回溯的相关部分:

C:\ProgramData\Miniconda3\envs\victory\lib\site-packages\ntlm_auth\compute_hash.py in _ntowfv1(password)
    165         return nt_hash
    166 
--> 167     digest = hashlib.new('md4', password.encode('utf-16-le')).digest()
    168 
    169     return digest

C:\ProgramData\Miniconda3\envs\victory\lib\hashlib.py in __hash_new(name, data, **kwargs)
    161         # This allows for SHA224/256 and SHA384/512 support even though
    162         # the OpenSSL library prior to 0.9.8 doesn't provide them.
--> 163         return __get_builtin_constructor(name)(data)
    164 
    165 

C:\ProgramData\Miniconda3\envs\victory\lib\hashlib.py in __get_builtin_constructor(name)
    118         return constructor
    119 
--> 120     raise ValueError('unsupported hash type ' + name)
    121 
    122 

ValueError: unsupported hash type md4

即使我尝试仅从 hashlib 调用 MD4,我也会得到相同的结果:

>>> import hashlib
>>> hashlib.new('md4')
Traceback (most recent call last):
  File "C:\ProgramData\Miniconda3\envs\victory\lib\hashlib.py", line 157, in __hash_new
    return _hashlib.new(name, data)
ValueError: [digital envelope routines] initialization error

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\ProgramData\Miniconda3\envs\victory\lib\hashlib.py", line 163, in __hash_new
    return __get_builtin_constructor(name)(data)
  File "C:\ProgramData\Miniconda3\envs\victory\lib\hashlib.py", line 120, in __get_builtin_constructor
    raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type md4

我们将非常感谢您对正在发生的事情的任何见解和/或任何帮助。

【问题讨论】:

  • 以下。这对我来说很好。
  • @FrankYellin 您是否使用相同的堆栈(Windows、python 3.8、requests-ntlm2)? hashlib.new('md4') 可以吗?
  • 我没有要补充的专业知识,但我在 Windows 上,使用的是全新的 Python 3.9,没有通过 PATH 提供的 OpenSSL,hashlib.new('md4') 适合我。
  • 如果没有别的,md4 有纯 Python 实现。 gist.github.com/kangtastic/c3349fc4f9d659ee362b12d7d8c639b6
  • 你用的是什么版本的openssl?我有一个类似的问题,对于以前有效的代码收到相同的错误消息。在网上搜索了很多解决方案后,我终于弄清楚了罪魁祸首是正在使用的 openssl 版本。我重建了我的环境并明确指定了 openssl=1.1.1 - 这为我解决了问题。

标签: python python-3.x ntlm hashlib ntlm-authentication


【解决方案1】:

好吧,我的 conda 环境中似乎有一些东西损坏了。我创建了一个新的相同的,从那以后它一直在工作,而无需更改任何其他内容。

【讨论】:

  • 这真的很可怕。我不喜欢损坏的 Conda 环境会导致 hashlib 生成虚假结果的事实。
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2020-02-07
  • 2020-01-24
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多