摘要 md5 响应生成

Digest md5 response generation

如何在 DIGEST MD5 质询的客户端响应中生成响应字段,我目前正在使用 rfc 2831 供参考

根据 rfc 2831 来自服务器的挑战示例是:

realm="elwood.innosoft.com",nonce="OA6MG9tEQGm2hh",qop="auth",
algorithm=md5-sess,charset=utf-8

根据 rfc 2831 示例来自客户端的响应:

charset=utf-8,username="chris",realm="elwood.innosoft.com",
nonce="OA6MG9tEQGm2hh",nc=00000001,cnonce="OA6MHXh6VqTrRk",
digest-uri="imap/elwood.innosoft.com",
response=d388dad90d4bbd760a152321f2143af7,qop=auth

收集的详细信息是:

  1. 用户名=克里斯
  2. 密码=秘密
  3. 随机数=OA6MG9tEQGm2hh
  4. nc-值=00000001
  5. cnonce=OA6MHXh6VqTrRk
  6. qop=auth
  7. 领域=elwood.innosoft.com
  8. 文摘=imap/elwood.innosoft.com

我生成的响应不符合第 19 页的 rfc 2831 示例中的响应

rfc 2831 中的公式

设 H(s) 为八位字节串 s 的 16 字节 MD5 散列 [RFC 1321]。

令 KD(k, s) 为 H({k, ":", s}),即字符串 k、冒号和字符串 s 的 16 个八位字节散列。

设 HEX(n) 表示 16 个八位字节 MD5 哈希值 n,表示为 32 个十六进制数字的字符串(字母字符始终为小写,因为 MD5 区分大小写)。


目前我正在使用以下程序:

A1 = { H(chris:elwood.innosoft.com:secret), ":", nonce-value, ":", cnonce-value }

online md5 generator

A1 = {eb5a750053e4d2c34aa84bbc9b0b6ee7:OA6MG9tEQGm2hh:OA6MHXh6VqTrRk}

A2 = { "AUTHENTICATE:", digest-uri-value } A2 = {验证:imap/elwood.innosoft.com}

H(A1) = 54442ff1f394d9d0de1205cef4d9cebe

十六进制(H(A1)) = 54442ff1f394d9d0de1205cef4d9cebe

十六进制(H(A2)) = 15e3594677e51ade69715d1cb7d207ba


RESPONSE=HEX( KD ( HEX(H(A1)), { nonce-value, ":" nc-value, ":", cnonce-value, ":", qop-value, ":" , 十六进制(H(A2)) }))

RESPONSE=HEX(KD (54442ff1f394d9d0de1205cef4d9cebe:OA6MG9tEQGm2hh:00000001:OA6MHXh6VqTrRk:auth:15e3594677e51ade69715d1cb7d207ba))

按照上述程序的响应是:

26ef1190b643a36e879673066098379c


但根据 rfc 的响应值为:

d388dad90d4bbd760a152321f2143af7

因此上面生成的响应与 rfc 示例中生成的响应不同

需要进行哪些更改?

您好, 您已正确计算响应,与 RFC2831 中的示例不一致。

A1计算错误。 chris:elwood.innosoft.com:secret 上的 MD5 摘要是 32 字节十六进制,每个原始字节 2 个八位字节。在 RFC 计算中它是 16 个八位字节,1 个八位字节 = 1 个字节。

抱歉,RFC 文档是正确的,您只是错误地计算了 A1 的哈希值。

因为,您将 "H(chris:elwood.innosoft.com:secret)" 的哈希值转换为十六进制字符串。但是 RFC 只是说 "Let H(s) be the 16 octet MD5 hash"。

只是,不要将哈希结果转换为十六进制字符串并与此字节数组哈希结果连接。

我希望这段代码有助于解释。

A1 = Md5Hash(Encoding.ASCII.GetBytes(username + ":" + realm + ":" + password))
     .Concat(
        Encoding.ASCII.GetBytes(
          ":" + nonce
        + ":" + cnonce
        + (authzid == null ? "" : (":" + authzid))))
     .ToArray();