Это, вероятно, не поможет, но CRAM-MD5 и CRAM-SHA1 довольно легко реализовать, если у вас есть правильная библиотека (md5 / sha1) и, в идеале, библиотека кодирования base64 (хотя вещи с base64 довольно просты) реализовать себя в крайнем случае).
Транзакция выглядит так:
C: AUTH CRAM-MD5
S: 334 BASE64(NONCE)
C: BASE64(USERNAME, " ", MD5((SECRET XOR opad),MD5((SECRET XOR ipad), NONCE)))
S: 235 Authentication succeeded
Где NONCE - это строка вызова для однократного времени, USERNAME - это имя пользователя, которое вы пытаетесь аутентифицировать, SECRET - это общий секрет («пароль»), opad - 0x5C, а ipad - 0x36.
(CRAM-SHA1 будет той же транзакцией, но с использованием SHA1 () вместо MD5 () для переваривания)
Итак, вот пример реальной транзакции CRAM-MD5
C: AUTH CRAM-MD5
S: 334 PDQ1MDMuMTIyMzU1Nzg2MkBtYWlsMDEuZXhhbXBsZS5jb20+
C: dXNlckBleGFtcGxlLmNvbSA4YjdjODA5YzQ0NTNjZTVhYTA5N2VhNWM4OTlmNGY4Nw==
S: 235 Authentication succeeded
Резервное копирование процесса на шаг, который вы получите:
S: 334 BASE64("<4503.1223557862@mail01.example.com>")
C: BASE64("user@example.com 8b7c809c4453ce5aa097ea5c899f4f87")
Если сделать шаг вперед до вычисления дайджеста, вы получите:
S: 334 BASE64("<4503.1223557862@mail01.example.com>")
C: BASE64("user@example.com ", MD5(("password" XOR opad),MD5(("password" XOR ipad), "<4503.1223557862@mail01.example.com>")))
Полагаю, это немного сбивает с толку, когда я это записываю, но, поверьте мне, по сравнению с попыткой сделать NTLM / SPA вручную, это очень просто. Если вы мотивированы, это на самом деле довольно легко реализовать. Или, может быть, я потратил много времени на то, чтобы держать в руках почтовых клиентов и серверов, чтобы больше думать об этом ...