Скажи мне, друг-сосиска: какой метод авторизации ты используешь, когда логинишься на почтовый сервак? Что я слышу? Plain text?! Иными словами, ты вводишь (а точнее, твой почтовик вводит) стандартные USER и PASS и получаешь данные о почтовом ящике.
Согласен, так делают большинство пользователей. И это плохо, потому как тебя могут запросто заснифать, то есть утащить твой пароль на почту (а
за ним и на шелл, FTP и т.п.). Чтобы этого не случилось, тебе предоставляется возможность авторизации с помощью шифрования MD5. Если почитать RFC, то мы отыщем там инфу о том, что в хеш заносятся следующие данные: баннер почтовика (тот, что в "<>" скобках), а также пароль на почту. Эта последовательность криптуется md5-алгоритмом и отправляется на сервер командой APOP. У команды два обязательных параметра - имя пользователя и MD5-хэш. Именно его ловят сниферы в момент прослушивания твоего интерфейса. Расшифровать этот хэш
вряд ли удастся по нижеследующей причине.
Баннер состоит из следующих частей: <уникальный_id.текущее_время@хост.машины>. К примеру, мой почтовик выдает следующий заголовок: "+OK POP3 Server 3.5.9 ready <14.1061593825@kamensk.net.ru>". Теперь ты понимаешь всю сложность шифрования? Мало того, что данные динамические, так они еще и MD5 шифруются! Хакеры отдыхают.
Для того, чтобы обезопасить себя, просто выбери вкладку Transport в настройках ящика твоего любимого The Bat. Затем нажми на кнопку Pop3 Autentification и выбирай тип MD5-APOP. Теперь ты в безопасности.
Хочешь большего? Тогда читай дальше. Теперь я научу тебя составлять хэши и
защищать твои шелл-скрипты от хакеров. Итак, чтобы составить md5-хэш, достаточно выполнить команду md5 -s 'строка'. К примеру, зашифруем последовательность '<14.1061593825@kamensk.net.ru>mypassword':
[forb@ruhost4 work]$ md5 -s '<14.1061593825@kamensk.net.ru>mypassword'
MD5 ("<14.1061593825@kamensk.net.ru>mypassword") = 58a6bc47c74f5913f1b207c2bc4795d8.
Что хотели, то и получили. Следующий способ более универсален, так как реализован он будет на Perl. Для этого заюзаем модуль Digest::MD5.
#!/usr/bin/perl
use Digest::MD5;
$salt=Digest::MD5->new; ## Новый метод для MD5
$pass='mypassword'; ## Заносим наш пароль
chomp($banner=<STDIN>); ## Запрашиваем баннер
$hash = $salt->add($banner,$pass); ## Формируем хэш
$passwd=$hash->hexdigest; ## Шифруем методом ASCII-HEX
print "salt is: $passwd\n"; ## Пишем полученный хэш
Остается запустить и проверить работу скрипта...
[root@ruhost4 forb]# perl md5.pl
<14.1061593825@kamensk.net.ru>
salt is: 58a6bc47c74f5913f1b207c2bc4795d8
Как видим, хэш совпадает с предыдущим, значит сценарий работает как надо.
Вернемся же к проблеме с почтой. Вышеизложенный алгоритм юзается в известном модуле Net::POP3. Мы не будем изобретать велосипед, а применим именно его. Точнее, напишем мини-скрипт, встречающийся у большинства на шеллах - сценарий будет коннектится к почтовому серверу, и, в случае наличия сообщения, дампить его в файл. Функция MD5-авторизации в перловом модуле называется apop(), а передать ей надо лишь логин и пароль.
#!/usr/bin/perl
use Net::POP3;
$host='mail.ru'; ## Почтовый сервер
$user='forb_mail'; ## Логин для соединения
$pass='mypassword'; ## Пароль
$log='message'; ## Файл, куда будет скидываться последнее сообщение при его наличии
$pop=Net::POP3->new($host) || die print "cannot make connection\n"; ## Создаем новый объект $pop, который соединяется с сервером.
$mess=$pop->apop($user,$pass); ## Авторизуемся. Функция apop() возвращает "0E0", если сообщений нет, undef - если произошла неудача, а в остальных случаях вернет количество мессаг в маилбоксе.
if (!defined $mess || $mess eq "0E0") { ## Если результат функции был "0E0: или undef
$mess ne "0E0" ? $reason = "Wrong password" : $reason = "No messages"; ## В первом случае, причина выхода - неверный пароль, во втором - отсутствие сообщений.
$pop->quit(); ## Корректно выходим.
exit print "$reason\n"; ## Пишем результат...
}
$message=$pop->get($mess); ## Если функция вернула число - вытягиваем последнее сообщение. Функция get() вернет ссылку на массив, в котором будет письмо.
print "total: $mess\n"; ## Дебаг может пригодиться...
open(LOG,">$log") || die print "Cant open log"; ## Откроем логфайл.
print LOG @$message; ## Пишем туда сообщение (не забудем
разыменовывать ссылку).
close(LOG); ## Закроем файл.
$pop->delete($mess); ## Удалим сообщение.
$pop->quit; ## И завершим скрипт.
Вот и весь простой сценарий. Теперь даже если тебя поломают и заснифают, пароль на почту врагам узнать не удастся. Разумеется ты будешь в безопасности в случае, если хакер не имеет доступ к скрипту, но рулит сетевым интерфейсом.
Советую включить авторизацию и в SMTP, это делается аналогично POP3. С шелл-скриптами помогать не буду =) - там другие модули и принцип авторизы - читай RFC и ты все поймешь. Удачи!