gpt4 book ai didi

python - 使用 CRAM-MD5 的 SMTP 身份验证

转载 作者:行者123 更新时间:2023-11-30 23:43:56 29 4
gpt4 key购买 nike

遵循 SMTP with CRAM-MD5 in Java 中给出的指南我用 Python 编写了一个小程序来计算将随机数作为输入时的响应:

import hashlib
from base64 import b64encode, b64decode
import sys
from decimal import *

#MD5(('secret' XOR opad), MD5(('secret' XOR ipad), challenge))
#opad - 0x5C, ipad - 0x36.

def main(nonce):
pwd = bytearray("password")

for i in range(len(pwd)):
pwd[i] = pwd[i] ^ 0x36

m1 = hashlib.md5()
m1.update(pwd.decode())
m1.update(b64decode(nonce))

m2 = hashlib.md5()

pwd = bytearray("password")

for i in range(len(pwd)):
pwd[i] = pwd[i] ^ 0x5C

m2.update(pwd.decode())
m2.update(m1.hexdigest())


print b64encode("username " + m2.hexdigest())


if __name__ == "__main__":
if (len(sys.argv) != 2):
print("ERROR usage: smtp-cram-md5 <nonce>")
else:
main(sys.argv[1])

但是,SMTP 服务器拒绝我给出的由该程序生成的响应。有人可以指出我做错了什么吗?

最佳答案

使用 HMAC 的 CRAM-MD5 实现示例。使用python2.7和python3.4进行测试。在 Python 3 上,可以通过将 hashlib.md5 替换为“md5”来避免 hashlib 导入。

"""
doc-testing with example values from RFC 2195

>>> challenge = 'PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+'
>>> user = 'tim'
>>> password = 'tanstaaftanstaaf'
>>> target_response = 'dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw'
>>> actual_response = cram_md5(user, password, challenge)
>>> target_response == actual_response
True
"""

import base64
import hashlib
import hmac

def cram_md5(user, password, challenge):
password = password.encode('utf-8')
challenge = base64.b64decode(challenge)
digest = hmac.HMAC(password, challenge, hashlib.md5).hexdigest()
response = '{} {}'.format(user, digest).encode()
return base64.b64encode(response).decode()

if __name__ == "__main__":
import doctest
doctest.testmod()

关于python - 使用 CRAM-MD5 的 SMTP 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10510133/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com