1

Java の CRAM-MD5 を使用した SMTP で指定されたガイドラインに従って、入力として nonce が与えられたときの応答を計算する小さなプログラムを 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 サーバーは、このプログラムによって生成された応答を拒否します。誰かが私が間違っていることを指摘できますか?

4

3 に答える 3

1

hmac モジュールを使用してこれを計算するか、少なくとも出力を再確認することができます。

Python2.x または 3.x を使用していますか? バイト/文字列の問題もあるかもしれません。

具体的には、バイト変更後 pwd.decode() は、もはや文字データではないものを理解しようとするため、ガベージを生成する可能性があります。

また、キー ブロックをハッシュ関数の入力ブロック サイズの倍数に拡張する手順が欠けているようです。

HMACのウィキペディアの記事には、役立つかもしれない Python の小さな例が含まれています。

于 2012-07-23T21:15:26.817 に答える