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

标签 python smtp

遵循 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/

相关文章:

python - 在python中将列表传递给sql

python - 实现 `df[m] = df[x] + df[y] + df[z]` 的更好方法

ssl - openssl 协商 STARTTLS 的 SSL 加密

asp.net - VB.Net MailMessage文本编码问题

Javascript IMAP 和 SMTP 客户端?

python - 根据元组将值插入像素

python - 如何处理像这样的Python导入

python - 异步上下文管理器

asp.net - Smtp 发送带有样式表的邮件

PHP 自定义 SMTP 邮件函数返回错误 fputs 发送字节失败 errno=32 Broken pipe