首页 > 解决方案 > 如何散列密码以用于 HttpNtlmAuth

问题描述

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

  1. 该问题的所选答案提到“向 HttpNtlmAuth 提供您的密码或密码的哈希值”,但没有详细说明。
  2. 对此线程的评论提到了对密码进行哈希处理,但没有回应使用哪种算法。

我已尝试根据此链接使用 MD4/UTF-16 ,也根据此链接尝试了 MD5,但两者都返回了 401(未经授权)响应。以下代码使用我的明文密码返回 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

标签: python-3.xhashpython-requestsntlm-authentication

解决方案


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

import getpass
password = getpass.getpass()

我已经解决了我的直接问题,但我仍然对散列感到好奇(如果可能的话,让这个脚本在无人值守的情况下运行)所以如果有人确实解决了这个问题,请提交回复。


推荐阅读