Форум: "Сети";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Внизwinsock - авторизация Найти похожие ветки
← →
Delphi_is_cool © (2005-08-15 02:49) [0]Как авторизироваться на smtp серваке ? Для последующей отправки почты.
← →
pepper © (2005-08-15 06:33) [1]RFC2554
S: 220 smtp.example.com ESMTP server ready
C: EHLO jgm.example.com
S: 250-smtp.example.com
S: 250 AUTH CRAM-MD5 DIGEST-MD5
C: AUTH FOOBAR
S: 504 Unrecognized authentication type.
C: AUTH CRAM-MD5
S: 334
PENCeUxFREJoU0NnbmhNWitOMjNGNndAZWx3b29kLmlubm9zb2Z0LmNvbT4=
C: ZnJlZCA5ZTk1YWVlMDljNDBhZjJiODRhMGMyYjNiYmFlNzg2ZQ==
S: 235 Authentication successful.
← →
Delphi_is_cool © (2005-08-15 18:58) [2]Можно по подробней плиз.
← →
Delphi_is_cool © (2005-08-15 18:58) [3]Можно по подробней плиз.
← →
Slym © (2005-08-16 04:57) [4]Подробнее в Яндексе - RFC2554
← →
sunsay © (2005-11-17 15:48) [5]pepper как раз оттуда и показывает пример ( из которого ничче не ясно )....
Подробности - RFC 2195
Ещё полезно заглянуть сюда:
http://bog.pp.ru/work/SASL.html
← →
sunsay © (2005-11-17 21:34) [6]Тоже этой проблемой занимался - вот набросал функцию, формирующую
HMAC-MD5 строчку (мож кому пригодится).
//-------------------------------------------------------------------------------//
// Функция вычисления HMAC для MD5 алгоритма //
// //
// INP: Key - ключ //
// Text - текст //
// OUT: хешированная строка //
//-------------------------------------------------------------------------------//
function HMAC_MD5(Key: String; const Text: String): String;
const
cBlockSize = 64; // размер блока данных
// константы для вычисления HMAC-MD5 для CRAM-MD5
ipad = $36;
opad = $5C;
procedure XORBlock (var Buf: String; const XOR8: Byte);
var
I: Integer;
begin
For I := 1 to Length(Buf) do
Buf[I] := Char(Byte(Buf[I]) xor XOR8);
end;
function HMAC_KeyBlock(const Key; const KeySize: Integer): String;
var
P: PChar;
Buf: String;
Begin
SetLength (Buf, cBlockSize);
P := Pointer (Buf);
if (KeySize > 0) then begin
Move (Key, P^, KeySize);
Inc (P, KeySize);
end;
FillChar (P^, cBlockSize - KeySize, #0);
Result := Buf;
End;
var
TempS: String;
begin
Result := "";
if (Length(Key) > cBlockSize) then
// хешируем ключ, и уже этот ключ
// используем в качестве ключа
Key := MD5DigestAsString(HashMD5(Key));
{ (1) append zeros to the end of K to create a B byte string
(e.g., if K is of length 20 bytes and B=64, then K will be
appended with 44 zero bytes 0x00)}
Key := HMAC_KeyBlock(PChar(Key)^, Length(Key));
{ (2) XOR (bitwise exclusive-OR) the B byte string computed in step
(1) with ipad}
TempS := Key;
XORBlock(TempS, ipad);
{ (3) append the stream of data "text" to the B byte string resulting
from step (2)}
TempS := TempS + Text;
{ (4) apply H to the stream generated in step (3)}
Result := MD5DigestAsString(HashMD5(TempS));
{ (5) XOR (bitwise exclusive-OR) the B byte string computed in
step (1) with opad}
TempS := Key;
XORBlock(TempS, opad);
{ (6) append the H result from step (4) to the B byte string
resulting from step (5)}
TempS := TempS + Result;
{ (7) apply H to the stream generated in step (6) and output
the result}
Result := MD5DigestAsHex(HashMD5(TempS));
end;
//....
// где-то в какой-то процедурке (при соединении с SMTP сервером):
// отсылаем серваку запрос "AUTH CRAM-MD5"
ResLine := SendCommand("AUTH CRAM-MD5");
// тут проверяем какой код вернул сервак (должен вернуть 334).
// помимо кода, сервак высылает "приглашение", закодированное
// в base64 - записываем это приглашение в Challange - тут
// писать не буду (ибо просто)
Challange := Base64Decode(Challange);
ResLine := SendCommand(Base64Encode(Username + " " + HMAC_MD5(Password, Challange)));
// мечтаем, чтоб результат был 235
Естественно должны быть реализованны функции
Base64Encode
Base64Decode
HashMD5
MD5DigestAsHex - возвращает 32 байтовый MD5 ввиде HEX
MD5DigestAsString - возвращает 16 байт MD5 (грубо говоря последовательность четырех двойных слов, только в типе String)
Удачи.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c