![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
winsock - авторизация [D7, WinXP]
Delphi_is_cool © (2005-08-15 02:49:00)Как авторизироваться на smtp серваке ? Для последующей отправки почты.
sunsay (2005-11-17 21:34:00) [1]Тоже этой проблемой занимался - вот набросал функцию, формирующую
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)
Удачи.
sunsay (2005-11-17 15:48:00) [2]pepper как раз оттуда и показывает пример ( из которого ничче не ясно )....
Подробности - RFC 2195
Ещё полезно заглянуть сюда:
http://bog.pp.ru/work/SASL.html
Slym (2005-08-16 04:57:00) [3]Подробнее в Яндексе - RFC2554
Delphi_is_cool (2005-08-15 18:58:00) [4]Можно по подробней плиз.
Delphi_is_cool (2005-08-15 18:58:00) [5]Можно по подробней плиз.
pepper (2005-08-15 06:33:00) [6]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.