Re: Как выглядит SMTP аутентификация?
Как пройти аутентификацию на SMTP-сервере посредством CRAM-MD5.
Для начала убеждаемся, что этот метод поддерживается:
З - Наш запрос, О - Ответ сервера
Соединяемся с сервером посредством fsockopen()
(за основу берем язык php)
-----
220 mailc.rambler.ru ESMTP Sendmail 8.12.10/8.12.10; Sat, 1 Oct 2005 12:18:01
+0400 (MSD)
250-mailc.rambler.ru Hello mx.learnware.ru [83.171.70.202], pleased to meet
you -----
З:EHLO somebody.ru
О:250-ENHANCEDSTATUSCODES
О:250-PIPELINING
O:250-8BITMIME
O:250-SIZE 4194304
O:250-DSN
O:250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
O:250-DELIVERBY
O:250 HELP
В данном случае нас интересует строка 250-AUTH, как мы видим, данный метод поддерживается
(CRAM-MD5 присутствует в списке)
З:AUTH CRAM-MD5 (даем серверу знать, что мы планируем авторизироваться, используя
этот метод)
O:334 PDkxNDE5OTk1NS40MDgxMjc2QG1haWxjLnJ hbWJsZXIucnU+
Присмотритесь к последней полученной строке. Обрезаем четыре символа слева (код ответа
и пробел) и выполняем
base64_decode($string). Получаем:<
[email protected]>
Затем нас выручит следующая функция:
function hmac($key, $data, $hash = 'md5', $blocksize = 64) {
if (strlen($key)>$blocksize) {
$key = pack('H*', $hash($key));
}
$key = str_pad($key, $blocksize, chr(0));
$ipad = str_repeat(chr(0x36), $blocksize);
$opad = str_repeat(chr(0x5c), $blocksize);
return $hash(($key^$opad) . pack('H*', $hash(($key^$ipad) . $data)));
}
Выполняем $keys= hmac($pass, $our_string,'md5', 64);
Где, $pass - это наш пароль на этом сервере,
$our_ string - это тот самый <
[email protected]>
Далее снова шифруем: base64_encode("$login $keys");Где $login - наш логин на сервере.
ПОлучаем строку: dXJtYWNoIDdlYjcxMTYwMDMwY2Q0N2E2MTl jZDU3YmNhOTRmODI1 - это
и есть наш ответ Чемберлену.
Отослав ее серверу, мы получим ответ: 235 2.0.0 OK Authenticated