如何散列密码以用于 HttpNtlmAuth

How do I hash a password for use with HttpNtlmAuth

我可以使用带有纯文本用户名和密码的 HttpNtlmAuth 请求访问我组织内的 Web 应用程序,但我不想在我的代码中以纯文本形式存储我的密码。我已经阅读了以下其他 SO 答案,您可以传递密码的哈希值而不是明文,但我不确定该怎么做:

  1. this question 的选择答案提到了 "supplying your password or the hash of your password to HttpNtlmAuth" 但没有详细说明。
  2. 关于 this thread 的评论提到了对密码进行哈希处理,但没有回应使用哪种算法。

我曾尝试使用 MD4/UTF-16 per this link and also tried MD5 according to this link 但两者都返回了 401(未经授权)响应。以下代码 returns 使用我的明文密码的 200 响应(成功)。

我是不是使用了错误的哈希算法,还是我遗漏了其他一些基本的东西?

import hashlib
import requests
from requests_ntlm import HttpNtlmAuth

# these are not the actual values
USERNAME = 'domain\username'
PASSWORD = 'password'
URL = 'https://internal_web_app/url.aspx?Parameters=values'

hashes = [
    PASSWORD,                                                    # No hash
    hashlib.new('md4', PASSWORD.encode('utf-16le')).hexdigest(), # NTLM
    hashlib.md5(PASSWORD.encode('utf-8')).hexdigest()            # MD5
]

for hash in hashes:
    # create a session
    session = requests.Session()
    # set up the authentication object with the respective string
    session.auth = HttpNtlmAuth(USERNAME, hash)
    # send a GET request (verify=False because the SSL cert is crappy)
    response = session.get(URL, verify=False)
    # expecting 200 for success and 401 for authentication failure
    print(response.status_code)

输出:

200
401
401

我的objective是为了避免将我的密码存储在笔记本中。我意识到一个解决方法是让用户在 运行 脚本中输入密码,使用

import getpass
password = getpass.getpass()

我已经解决了我眼前的问题,但我仍然对散列感到好奇(如果可能的话,让这个脚本 运行 无人值守)所以如果有人弄明白了请提交响应。