Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо