消化md5响应生成

时间:2016-11-09 11:18:22

标签: md5 digest rfc digest-authentication sasl

如何在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. digesturi = IMAP / elwood.innosoft.com
  9. 生成的响应不符合第19页的rfc 2831示例中的响应

    rfc 2831中的配方

    设H(s)为八位字符串s的16个八位位组MD5哈希[RFC 1321]。

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

    让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 = {AUTHENTICATE:imap / elwood.innosoft.com}

    H(A1)= 54442ff1f394d9d0de1205cef4d9cebe

    HEX(H(A1))= 54442ff1f394d9d0de1205cef4d9cebe

    HEX(H(A2))= 15e3594677e51ade69715d1cb7d207ba

    RESPONSE = HEX(KD(HEX(H(A1)),{nonce-value,":" nc-value,":",cnonce-value,& #34;:",qop-value,":",HEX(H(A2))}))

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

    按照上述程序的回应是:

    26ef1190b643a36e879673066098379c

    但是根据rfc的响应值是:

    d388dad90d4bbd760a152321f2143af7

    因此,上面生成的响应与rfc的示例

    中生成的响应不同

    需要进行哪些更改?

3 个答案:

答案 0 :(得分:1)

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

因为,您将“ H(chris:elwood.innosoft.com:secret)”的哈希值转换为十六进制字符串。但是RFC只是说“让H(s)成为16个八位位组的MD5哈希”。

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

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

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

答案 1 :(得分:0)

A1计算错误。基于chris的MD5摘要:elwood.innosoft.com:在你的情况下秘密是32个八位字节的十六进制,每个原始字节2个八位字节。在RFC计算中,它是16个八位位组,1个八位位组= 1个字节。

答案 2 :(得分:-1)

<强>嗨, 您已正确计算响应,RFC2831中的示例不一致。