DIGEST-MD5 SASL Mechanism
От: AShe  
Дата: 09.12.04 14:18
Оценка:
Привет всем. Помогите разобраться с проблемой. Необходимо авторизоваться на почтовом сервере с помощью механизма Digest-MD5. Посмотрел как это делаеться в RFC 2831, но не могу пройти второй шаг авторизации. Выглядит это так:

S: nonce="Z+v9mjZOMiTrjTr/g+GDIiwfQaViBkAjp6OLvl+QOJs=",realm="POCHTA.RU",qop="auth
,auth-int,auth-conf",cipher="rc4-40,rc4-56,rc4,des,3des",maxbuf=4096,charset=utf-8,algorithm=md5-sess

C: username="ashe@hotbox.ru",realm="POCHTA.RU",nonce="Z+v9mjZOMiTrjTr/g+GDIiwfQaViB
kAjp6OLvl+QOJs=",cnonce="blablabla",nc=00000001,qop=auth,digest-uri="imap/mx.pochta.ru/hotbox.ru",
response=31055289d8810f2f70ba13d1da5da736,charset=utf-8

S: 0001 NO authentication failure

Response вычисляю таким образом:

        private string ComputeResponseValue(DigestMD5Response resp)
        {
            string a1 = ComputeA1Value(resp);
            string a2 = string.Format("{0}:{1}", "AUTHENTICATE", "imap/mx.pochta.ru/hotbox.ru");

            a1 = GetMD5HashHex(a1);
            a2 = GetMD5HashHex(a2);

            string concatStr = string.Format("{0}:{1}:{2}:{3}:{4}:{5}", 
                a1, Encoding.ASCII.GetString(Convert.FromBase64String("Z+v9mjZOMiTrjTr/g+GDIiwfQaViBkAjp6OLvl+QOJs=")), "00000001", "blablabla", "auth", a2);

            return GetMD5HashHex(concatStr);
        }

        private string ComputeA1Value(DigestMD5Response resp)
        {
            string strSS = string.Format(string.Format("{0}:{1}:{2}", "ashe@hotbox.ru", "POCHTA.RU", "**********"));
            byte[] bytesSS = Encoding.ASCII.GetBytes(strSS);
            bytesSS = new MD5CryptoServiceProvider().ComputeHash(bytesSS);
            return string.Format("{0}:{1}:{2}", Encoding.ASCII.GetString(bytesSS), Encoding.ASCII.GetString(Convert.FromBase64String("Z+v9mjZOMiTrjTr/g+GDIiwfQaViBkAjp6OLvl+QOJs=")), "blablabla");
        }

        private string GetMD5HashHex(string input)
        {
            byte[] res = new MD5CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes(input));
            StringBuilder sOutput = new StringBuilder(res.Length);
            for(int i = 0; i < res.Length; i++)
            {
                sOutput.Append(res[i].ToString("X2"));
            }
            return sOutput.ToString().ToLower();
        }

Буду благодарен за любую помощь . Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.