Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: XMMP Добавлено: 26.07.10 00:37  

Автор вопроса:  AWP | Web-сайт: xawp.narod.ru | ICQ: 345685652 
Не могу разобраться как пройти авторизацию.
Т.е. проблемма в том, как закодировать response.
username="",
realm="jabber.ru",
nonce="",
cnonce="2313e069649daa0ca2b76363525059ebd",
nc=00000001,
qop=auth,
digest-uri="xmpp/jabber.ru"
,charset=utf-8,
response=16351f86cc5591312e20b4ccd880eadb


видел функцию на дельфи - ничего не понял.

Ответить

  Ответы Всего ответов: 17  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 26.07.10 01:20
Почитай тут как делается, и в спецификации HTTP.
http://en.wikipedia.org/wiki/Digest_authentication

Там вобщем надо хешировать пароль, случайный код и еще кое-что.

На HttpWebRequest вроде легко делается (если на дотнете пишешь)

Ответить

Номер ответа: 2
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #2
Добавлено: 26.07.10 01:55
на сокетах.
Да там черт ногу сломит... Хешировать суммы какихто параметров, а потом какую хитрую хец функцию поверх накладывать... голова уже пухнет.
А за wiki спасибо, там более понятно расписано.

Ответить

Номер ответа: 3
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #3
Добавлено: 26.07.10 02:42
Вроде написал, но выдает
  1. <failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
  2. <temporary-auth-failure/>
  3. </failure>


Ошибка сервера? или я накосячил?

Ответить

Номер ответа: 4
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #4
Добавлено: 26.07.10 03:19
причем странно.
  1. S = MD5(HA1 & ":" & nonce & ":" & nc & ":" & cnonce & ":" & qop & ":" & HA2)
если вручную меняю nonce, то ничего не выдает, хотя все это под хэш функцией. Ничего он не выдает и если вообще чуть посылать.
т.е. есть подозрения, что дело в сервере, но через нормальные клиенты соединяется. Поэтому я пойду, ударю себя пару раз об стену...

Ответить

Номер ответа: 5
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #5
Добавлено: 26.07.10 04:24
может гуру что-гибудь скажут?

мой код такой.
  1. Function LoginTab(User, Pass, Host, nonce)
  2.     Dim S As String
  3.     Dim D As String
  4.     Dim response As String
  5.     
  6.     response = GenResponse(User, Host, "xmpp/" & Host, Pass, nonce)
  7.     
  8.     S = S & "username=" & Chr$(34) & User & Chr$(34) & ","
  9.     S = S & "realm=" & Chr$(34) & Host & Chr$(34) & ","
  10.     S = S & "nonce=" & Chr$(34) & nonce & Chr$(34) & ","
  11.     S = S & "cnonce=" & Chr$(34) & cnonce & Chr$(34) & ","
  12.     S = S & "nc=00000001,"
  13.     S = S & "qop=auth,"
  14.     S = S & "digest-uri=" & Chr$(34) & "xmpp/" & Host & Chr$(34) & ","
  15.     S = S & "charset=utf-8,"
  16.     S = S & "response=" & response
  17.     S = Base64.Encode(S)
  18.     D = "<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" & S & "</response>"
  19.     
  20.     LoginTab = D
  21. End Function
  22.  
  23. Function GenResponse(UserName, realm, digest_uri, passwd, nonce) As String
  24.     Const nc As String = "00000001"
  25.     Const qop As String = "auth"
  26.  
  27. '        Digest access authentication
  28. '        HA1 = LCase$(MD5(UserName & ":" & realm & ":" & passwd))
  29. '        HA2 = LCase$(MD5("AUTHENTICATE:" & digest_uri))
  30. 'GenResponse = LCase$(MD5(HA1 & ":" & nonce & ":" & nc & ":" & cnonce & ":" & qop & ":" & HA2))
  31.  
  32. '       XMMP authentication (RFC 2831 Digest SASL Mechanism)
  33.         HA1 = MD5str(UserName & ":" & realm & ":" & passwd) & ":" & nonce & ":" & cnonce
  34.         HA2 = "AUTHENTICATE:" & digest_uri
  35. GenResponse = MD5(MD5(MD5str(HA1)) & nonce & ":" & nc & ":" & cnonce & ":" & qop & ":" & MD5(MD5str(HA2)))
  36. End Function

где
MD5 - 16-байтовый MD5-хеш n, приведенный в 32 байтовую Hex-строку в нижнем регистре. Фактически строковое представление дайджеста MD5.
MD5str - 16-байтовый MD5-хеш строки s

Ответить

Номер ответа: 6
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 26.07.10 13:51
Попробуй расковырять System.Net.HttpWebRequest (думаю, глубоко ковырять прийдется).

Ответить

Номер ответа: 7
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #7
Добавлено: 26.07.10 15:07
я не в Нете пишу.

Ответить

Номер ответа: 8
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #8
Добавлено: 26.07.10 16:38
или если кто шарит в дельфи, сможете перевести?
  1. function GenResponse(UserName, realm, digest_uri, Pass, nonce, cnonce : String) : string;
  2. const
  3.   nc         = '00000001';
  4.   gop        = 'auth';
  5. var
  6.   A2, HA1, HA2,
  7.   sJID : String;
  8.   Razdel    : Byte;
  9.   Context   : TMD5Context;
  10.   DigestJID : TMD5Digest;
  11.   DigestHA1 : TMD5Digest;
  12.   DigestHA2 : TMD5Digest;
  13.   DigestResponse : TMD5Digest;
  14. begin
  15.   Razdel := Ord(':');
  16.   // ВЫЧИСЛЯЕМ А1 по формуле RFC 2831
  17.   //  A1 = { H( { username-value, ":", realm-value, ":", passwd } ),
  18.   //           ":", nonce-value, ":", cnonce-value, ":", authzid-value }
  19.   sJID  := format('%S:%S:%S', [username, realm, Pass]);
  20.   MD5Init(Context);
  21.   MD5UpdateBuffer(Context, PByteArray(@sJID[1])  , Length(sJID));
  22.   MD5Final(DigestJID, Context);
  23.  
  24.   MD5Init(Context);
  25.   MD5UpdateBuffer(Context, PByteArray(@DigestJID),SizeOf(TMD5Digest));
  26.   MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
  27.   MD5UpdateBuffer(Context, PByteArray(@nonce[1])  , Length(nonce));
  28.   MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
  29.   MD5UpdateBuffer(Context, PByteArray(@cnonce[1])  , Length(cnonce));
  30.   MD5Final(DigestHA1, Context);
  31.  
  32.   // ВЫЧИСЛЯЕМ А2 по формуле RFC 2831
  33.   //  A2       = { "AUTHENTICATE:", digest-uri-value }
  34.   A2   := format('AUTHENTICATE:%S', [digest_uri]);
  35.   MD5Init(Context);
  36.   MD5UpdateBuffer(Context, PByteArray(@A2[1])  , Length(A2));
  37.   MD5Final(DigestHA2, Context);
  38.  
  39.   // ВЫЧИСЛЯЕМ RESPONSE по формуле RFC 2831
  40.   //  HEX( KD ( HEX(H(A1)),
  41.   //                 { nonce-value, ":" nc-value, ":",
  42.   //                   cnonce-value, ":", qop-value, ":", HEX(H(A2)) }))
  43.   HA1 := LowerCase( PacketToHex(@DigestHA1, SizeOf(TMD5Digest)));
  44.   HA2 := LowerCase( PacketToHex(@DigestHA2, SizeOf(TMD5Digest)));
  45.   MD5Init(Context);
  46.   MD5UpdateBuffer(Context, PByteArray(@HA1[1]),Length(HA1));
  47.   MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
  48.   MD5UpdateBuffer(Context, PByteArray(@nonce[1])  , Length(nonce));
  49.   MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
  50.   MD5UpdateBuffer(Context, PByteArray(@nc[1])  , Length(nc));
  51.   MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
  52.   MD5UpdateBuffer(Context, PByteArray(@cnonce[1])  , Length(cnonce));
  53.   MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
  54.   MD5UpdateBuffer(Context, PByteArray(@gop[1])  , Length(gop));
  55.   MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
  56.   MD5UpdateBuffer(Context, PByteArray(@HA2[1]),Length(HA2));
  57.   MD5Final(DigestResponse, Context);
  58.   Result := LowerCase( PacketToHex(@DigestResponse, SizeOf(TMD5Digest)) )
  59.  end;

Ответить

Номер ответа: 9
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #9
Добавлено: 26.07.10 22:09
Ну помогите! Второй день е**сь
Вот это на vb6 перетащить.
Т.е. я это сделал, но где ошибки допереть не могу.
  1. Алгоритм вычисления строки ответа response имеет следующую формулу:
  2.  
  3. response-value  =
  4.          HEX( KD ( HEX(H(A1)),
  5.                  { nonce-value, ":" nc-value, ":",
  6.                    cnonce-value, ":", qop-value, ":", HEX(H(A2)) }))
  7.       A1 = { H( { username-value, ":", realm-value, ":", passwd } ),
  8.            ":", nonce-value, ":", cnonce-value }
  9.       A2 = { "AUTHENTICATE:", digest-uri-value }
  10.  
  11. Где:
  12. Выражение { a, b, ... } - означает сложение строк a, b
  13. HEX(n) - 16-байтовый MD5-хеш n, приведенный в 32 байтовую Hex-строку в нижнем регистре. Фактически строковое представление дайджеста MD5.
  14. H(s) - 16-байтовый MD5-хеш строки s
  15. KD(k, s) - объединение данных (строк) k, s
  16. H({k, ":", s}) - 16-байтовый MD5-хеш, полученный в результате сложения строки k, ":", S

Ответить

Номер ответа: 10
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #10
Добавлено: 26.07.10 23:04
нашел на C++
но тоже перевести не могу. Помогите!)
  1. DIGESTMD5Response::DIGESTMD5Response(const QByteArray& challenge, const QString& service, const QString& host, const QString& arealm, const QString& user, const QString& authz,  const QByteArray& password, const RandomNumberGenerator& rand) : isValid_(true)
  2. {
  3.         QString realm = arealm;
  4.  
  5.         // get props
  6.         DIGESTMD5PropList in;
  7.         if(!in.fromString(challenge)) {
  8.                 isValid_ = false;
  9.                 return;
  10.         }
  11.         //qDebug() << (QString("simplesasl.cpp: IN: %1").arg(QString(in.toString())));
  12.  
  13.         // make a cnonce
  14.         QByteArray a;
  15.         a.resize(32);
  16.         for(int n = 0; n < (int)a.size(); ++n) {
  17.                 a[n] = (char) rand.generateNumberBetween(0, 255);
  18.         }
  19.         QByteArray cnonce = Base64::encode(a).toLatin1();
  20.  
  21.         // make other variables
  22.         if (realm.isEmpty()) {
  23.                 realm = QString::fromUtf8(in.get("realm"));
  24.         }
  25.         QByteArray nonce = in.get("nonce");
  26.         QByteArray nc = "00000001";
  27.         QByteArray uri = service.toUtf8() + '/' + host.toUtf8();
  28.         QByteArray qop = "auth";
  29.  
  30.         // build 'response'
  31.         QByteArray X = user.toUtf8() + ':' + realm.toUtf8() + ':' + password;
  32.         QByteArray Y = QCA::Hash("md5").hash(X).toByteArray();
  33.         QByteArray tmp = ':' + nonce + ':' + cnonce;
  34.         if (!authz.isEmpty())
  35.                 tmp += ':' + authz.toUtf8();
  36.         //qDebug() << (QString(tmp));
  37.  
  38.         QByteArray A1(Y + tmp);
  39.         QByteArray A2 = QByteArray("AUTHENTICATE:") + uri;
  40.         QByteArray HA1 = QCA::Hash("md5").hashToString(A1).toLatin1();
  41.         QByteArray HA2 = QCA::Hash("md5").hashToString(A2).toLatin1();
  42.         QByteArray KD = HA1 + ':' + nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + HA2;
  43.         QByteArray Z = QCA::Hash("md5").hashToString(KD).toLatin1();
  44.  
  45.         //qDebug() << (QString("simplesasl.cpp: A1 = %1").arg(QString(A1)).toAscii());
  46.         //qDebug() << (QString("simplesasl.cpp: A2 = %1").arg(QString(A2)).toAscii());
  47.         //qDebug() << (QString("simplesasl.cpp: KD = %1").arg(QString(KD)).toAscii());
  48.  
  49.         // build output
  50.         DIGESTMD5PropList out;
  51.         out.set("username", user.toUtf8());
  52.         if (!realm.isEmpty())
  53.                 out.set("realm", realm.toUtf8());
  54.         out.set("nonce", nonce);
  55.         out.set("cnonce", cnonce);
  56.         out.set("nc", nc);
  57.         //out.set("serv-type", service.toUtf8());
  58.         //out.set("host", host.toUtf8());
  59.         out.set("digest-uri", uri);
  60.         out.set("qop", qop);
  61.         out.set("response", Z);
  62.         out.set("charset", "utf-8");
  63.         if (!authz.isEmpty())
  64.                 out.set("authzid", authz.toUtf8());
  65.         value_  = out.toString();
  66. }

Ответить

Номер ответа: 11
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #11
Добавлено: 27.07.10 18:04
я особо разбираца не буду, но вроде по коду с++ там берется
  1. md5str(md5str(md5(user + ':' + realm + ':' + password) + ':' + nonce + ':' + cnonce) + ':' + nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + md5str('AUTHENTICATE:' + uri))

а у тебя берется
  1. md5(md5(md5str(md5str(user + ':' + realm + ':' + password) + ':' + nonce + ':' + cnonce)) + nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + md5(md5str('AUTHENTICATE:' + uri )))


как видишь различия есть

Ответить

Номер ответа: 12
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #12
Добавлено: 28.07.10 22:59
спасибо, попробую.

Ответить

Номер ответа: 13
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #13
Добавлено: 29.07.10 00:49
точно не так. Последняя функция должна возвращать хэш в 16ричном виде.

Ответить

Номер ответа: 14
Автор ответа:
 PROgrammIST



ICQ: 403099048 

Вопросов: 22
Ответов: 94
 Web-сайт: forum.quotedev.org.ru
 Профиль | | #14
Добавлено: 29.07.10 21:24
AWP, а может сделать модуль на .NET и присоединить к VB? Я пытался с помощью проги перевести, но там перевод только на .NET

Ответить

Номер ответа: 15
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #15
Добавлено: 29.07.10 23:07
может и можно, но тогда проще всю прогу на net написать.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам