Страница: 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
видел функцию на дельфи - ничего не понял.
Ответить
Номер ответа: 5Автор ответа: AWP
ICQ: 345685652 Вопросов: 96Ответов: 1212
Web-сайт: xawp.narod.ru Профиль | | #5
Добавлено: 26.07.10 04:24
может гуру что-гибудь скажут?
мой код такой.
Function LoginTab(User, Pass, Host, nonce)
Dim S As String
Dim D As String
Dim response As String
response = GenResponse(User, Host, "xmpp/" & Host, Pass, nonce)
S = S & "username=" & Chr$(34) & User & Chr$(34) & ","
S = S & "realm=" & Chr$(34) & Host & Chr$(34) & ","
S = S & "nonce=" & Chr$(34) & nonce & Chr$(34) & ","
S = S & "cnonce=" & Chr$(34) & cnonce & Chr$(34) & ","
S = S & "nc=00000001,"
S = S & "qop=auth,"
S = S & "digest-uri=" & Chr$(34) & "xmpp/" & Host & Chr$(34) & ","
S = S & "charset=utf-8,"
S = S & "response=" & response
S = Base64.Encode(S)
D = "<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" & S & "</response>"
LoginTab = D
End Function
Function GenResponse(UserName, realm, digest_uri, passwd, nonce) As String
Const nc As String = "00000001"
Const qop As String = "auth"
HA1 = MD5str(UserName & ":" & realm & ":" & passwd) & ":" & nonce & ":" & cnonce
HA2 = "AUTHENTICATE:" & digest_uri
GenResponse = MD5(MD5(MD5str(HA1)) & nonce & ":" & nc & ":" & cnonce & ":" & qop & ":" & MD5(MD5str(HA2)))
End Function
где
MD5 - 16-байтовый MD5-хеш n, приведенный в 32 байтовую Hex-строку в нижнем регистре. Фактически строковое представление дайджеста MD5.
MD5str - 16-байтовый MD5-хеш строки s
Ответить
Номер ответа: 8Автор ответа: AWP
ICQ: 345685652 Вопросов: 96Ответов: 1212
Web-сайт: xawp.narod.ru Профиль | | #8
Добавлено: 26.07.10 16:38
или если кто шарит в дельфи, сможете перевести?
function GenResponse(UserName, realm, digest_uri, Pass, nonce, cnonce : String ) : string ;
const
nc =
gop =
var
A2, HA1, HA2,
sJID : String ;
Razdel : Byte ;
Context : TMD5Context;
DigestJID : TMD5Digest;
DigestHA1 : TMD5Digest;
DigestHA2 : TMD5Digest;
DigestResponse : TMD5Digest;
begin
Razdel := Ord(
// ВЫЧИСЛЯЕМ А1 по формуле RFC 2831
// A1 = { H( { username-value, ":" , realm-value, ":" , passwd } ),
// ":" , nonce-value, ":" , cnonce-value, ":" , authzid-value }
sJID := format(
MD5Init(Context);
MD5UpdateBuffer(Context, PByteArray(@sJID[1]) , Length(sJID));
MD5Final(DigestJID, Context);
MD5Init(Context);
MD5UpdateBuffer(Context, PByteArray(@DigestJID),SizeOf(TMD5Digest));
MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
MD5UpdateBuffer(Context, PByteArray(@nonce[1]) , Length(nonce));
MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
MD5UpdateBuffer(Context, PByteArray(@cnonce[1]) , Length(cnonce));
MD5Final(DigestHA1, Context);
// ВЫЧИСЛЯЕМ А2 по формуле RFC 2831
// A2 = { "AUTHENTICATE:" , digest-uri-value }
A2 := format(
MD5Init(Context);
MD5UpdateBuffer(Context, PByteArray(@A2[1]) , Length(A2));
MD5Final(DigestHA2, Context);
// ВЫЧИСЛЯЕМ RESPONSE по формуле RFC 2831
// HEX( KD ( HEX(H(A1)),
// { nonce-value, ":" nc-value, ":" ,
// cnonce-value, ":" , qop-value, ":" , HEX(H(A2)) }))
HA1 := LowerCase( PacketToHex(@DigestHA1, SizeOf(TMD5Digest)));
HA2 := LowerCase( PacketToHex(@DigestHA2, SizeOf(TMD5Digest)));
MD5Init(Context);
MD5UpdateBuffer(Context, PByteArray(@HA1[1]),Length(HA1));
MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
MD5UpdateBuffer(Context, PByteArray(@nonce[1]) , Length(nonce));
MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
MD5UpdateBuffer(Context, PByteArray(@nc[1]) , Length(nc));
MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
MD5UpdateBuffer(Context, PByteArray(@cnonce[1]) , Length(cnonce));
MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
MD5UpdateBuffer(Context, PByteArray(@gop[1]) , Length(gop));
MD5UpdateBuffer(Context, @Razdel , SizeOf(Razdel));
MD5UpdateBuffer(Context, PByteArray(@HA2[1]),Length(HA2));
MD5Final(DigestResponse, Context);
Result := LowerCase( PacketToHex(@DigestResponse, SizeOf(TMD5Digest)) )
end;
Ответить
Номер ответа: 9Автор ответа: AWP
ICQ: 345685652 Вопросов: 96Ответов: 1212
Web-сайт: xawp.narod.ru Профиль | | #9
Добавлено: 26.07.10 22:09
Ну помогите! Второй день е**сь
Вот это на vb6 перетащить.
Т.е. я это сделал, но где ошибки допереть не могу.
Алгоритм вычисления строки ответа response имеет следующую формулу:
response-value =
HEX( KD ( HEX(H(A1)),
{ nonce-value, ":" nc-value, ":" ,
cnonce-value, ":" , qop-value, ":" , HEX(H(A2)) }))
A1 = { H( { username-value, ":" , realm-value, ":" , passwd } ),
":" , nonce-value, ":" , cnonce-value }
A2 = { "AUTHENTICATE:" , digest-uri-value }
Где:
Выражение { a, b, ... } - означает сложение строк a, b
HEX(n) - 16-байтовый MD5-хеш n, приведенный в 32 байтовую Hex-строку в нижнем регистре. Фактически строковое представление дайджеста MD5.
H(s) - 16-байтовый MD5-хеш строки s
KD(k, s) - объединение данных (строк) k, s
H({k, ":" , s}) - 16-байтовый MD5-хеш, полученный в результате сложения строки k, ":" , S
Ответить
Номер ответа: 10Автор ответа: AWP
ICQ: 345685652 Вопросов: 96Ответов: 1212
Web-сайт: xawp.narod.ru Профиль | | #10
Добавлено: 26.07.10 23:04
нашел на C++
но тоже перевести не могу. Помогите!)
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 )
{
QString realm = arealm;
// get props
DIGESTMD5PropList in ;
if (!in .fromString(challenge)) {
isValid_ = false ;
return ;
}
//qDebug() << (QString("simplesasl.cpp: IN: %1" ).arg(QString(in.toString())));
// make a cnonce
QByteArray a;
a.resize(32);
for (int n = 0; n < (int )a.size(); ++n) {
a[n] = (char ) rand.generateNumberBetween(0, 255);
}
QByteArray cnonce = Base64::encode(a).toLatin1();
// make other variables
if (realm.isEmpty()) {
realm = QString::fromUtf8(in.get ("realm" ));
}
QByteArray nonce = in .get ("nonce" );
QByteArray nc = "00000001" ;
QByteArray uri = service.toUtf8() +
QByteArray qop = "auth" ;
// build
QByteArray X = user.toUtf8() +
QByteArray Y = QCA::Hash("md5" ).hash(X).toByteArray();
QByteArray tmp =
if (!authz.isEmpty())
tmp +=
//qDebug() << (QString(tmp));
QByteArray A1(Y + tmp);
QByteArray A2 = QByteArray("AUTHENTICATE:" ) + uri;
QByteArray HA1 = QCA::Hash("md5" ).hashToString(A1).toLatin1();
QByteArray HA2 = QCA::Hash("md5" ).hashToString(A2).toLatin1();
QByteArray KD = HA1 +
QByteArray Z = QCA::Hash("md5" ).hashToString(KD).toLatin1();
//qDebug() << (QString("simplesasl.cpp: A1 = %1" ).arg(QString(A1)).toAscii());
//qDebug() << (QString("simplesasl.cpp: A2 = %1" ).arg(QString(A2)).toAscii());
//qDebug() << (QString("simplesasl.cpp: KD = %1" ).arg(QString(KD)).toAscii());
// build output
DIGESTMD5PropList out ;
out .set ("username" , user.toUtf8());
if (!realm.isEmpty())
out .set ("realm" , realm.toUtf8());
out .set ("nonce" , nonce);
out .set ("cnonce" , cnonce);
out .set ("nc" , nc);
//out .set ("serv-type" , service.toUtf8());
//out .set ("host" , host.toUtf8());
out .set ("digest-uri" , uri);
out .set ("qop" , qop);
out .set ("response" , Z);
out .set ("charset" , "utf-8" );
if (!authz.isEmpty())
out .set ("authzid" , authz.toUtf8());
value_ = out .toString();
}
Ответить
Страница: 1 | 2 |
Поиск по форуму