CRAM-MD5 Внедрение - PullRequest
       19

CRAM-MD5 Внедрение

0 голосов
/ 21 июля 2011

Я смотрю на реализацию аутентификации CRAM-MD5 для сервера IMAP и SMTP. Проблема в том, что CRAM, кажется, требует, чтобы в любое время был доступен открытый текстовый пароль. Сервер отправляет клиенту уникальный вызов, а клиент возвращает:

MD5( MD5(password, challenge), MD5( password ) )

Я не вижу способа проверить это без пароля с открытым текстом, в спецификации не сказано, что имеет , чтобы иметь его в наличии, но это только кажется логичным.

Единственное решение, которое я могу придумать, - это зашифровать (правильно зашифровать, а не хешировать) пароль в базе данных (возможно, используя AES на основе ключа RSA, поскольку у меня уже есть с этим что-то для решения проблемы) и расшифровать его, когда мне нужно Сравнение кажется очень медленным, так как для каждого входа в систему по SMTP и IMAP потребуется расшифровка и хеширование.

Это лучшее решение / наиболее эффективное решение?

Или, что еще лучше, CRAM устарел сейчас, потому что теперь менее безопасная аутентификация по проводам обеспечивается с помощью SSL?

Ответы [ 3 ]

1 голос
/ 23 июля 2011

Хитрость в том, что все, что вам действительно нужно, это нефинализированный md5 пароля, который совпадает с промежуточным состоянием контекста md5 перед финализацией.

MD5_CTX ctx;
MD5Init(&ctx);
MD5Update(&ctx, password, length);

если вы сделаете это, а затем сохраните значение ctx как hashed, тогда можно будет использовать его копии в CRAM MD5, например,

для MD5(password, challenge)

MD5Update(&hashed, challenge, length);
MD5Final(&digest, &hashed);

и для MD5( password )

MD5Final(&digest, &hashed);

остальное MD5( MD5(password, challenge), MD5( password ) ) довольно просто

Мне бы хотелось использовать Python для этого примера, но в стандартном md5 нет способа получить доступ к состоянию объекта md5, поэтому я использовал API libmd5

1 голос
/ 28 июля 2011

Исходники для Python hashlib.py говорят, что вы можете инициализировать экземпляр хеша с двоичными данными, но при использовании это, кажется, означает "инициализировать с помощью хеша этих данных".

Однако вы можете клонировать объект с неизменным его внутренним состоянием, чтобы вы могли выбрать объект и сохранить его вместо пароля.Чтобы получить пароль MD5, открепить объект и получить хэш запроса, отнять его и вызвать его метод update () с данными запроса.

1 голос
/ 23 июля 2011

В настоящее время существует проект RFC, предлагающий перевести DIGEST-MD5 в историческое состояние, CRAM MD5 также находится не в лучшем состоянии.

Если вы хотите надлежащую безопасность, начните с TLS и SASL - вв этом режиме PLAIN считается приемлемым, но, если вы считаете, что он не является удовлетворительным, я бы рекомендовал реализовать поверх него GSSAPI или NTLM.

...