Задача - взаимная аутентификация сервера и клиента по паролю (без имени), процедура должна реализовываться посредством текстового протокола (требования не обсуждаются, они «константа»). Алгоритм должен быть легко реализуем без всяких openssl/gnutls, максимум допустимо использовать какой-нибудь алгоритм построения хэш-суммы - клиентов (и возможно и серверы) предстоит писать на Java/C++/ObjC/Delphi/C#/Vala/Python.
Пока появилась такая идея - после подключения клиента, сервер отдает клиенту рандомное значение и отправляет сообщение вида:
type:auth
random:123456789
Клиент формирует ответ вида
type:auth
random:987654321
timestamp:124364477 (это GMT-time-in-millis)
checksum: MD5(<timestamp-указанный-выше>+":"+<рандом сервера == 123456789>+":"+<пароль>)
Сервер проверяет валидность таймстампа (в пределах допустимого отклонения), проверяет валидность контрольной суммы (таймстамп сказал клиент, рандом ранее сгенерирован, пароль известен). Если проверка нормальная, сервер сам аутентифицируется перед клиентом:
type:auth
timestamp:124365897
checksum: MD5(<таймстамп-из-сообщения>+":"+<рандом клиента == 987654321> + ":" + <пароль>)
В принципе, алгоритм кажется достаточно надёжным - пароль не передается ни в каком виде, на каждый сеанс вылетают свои случайные числа. Что скажет коллективный разум?