CRAM MD5 RFC2195部分翻译 - tRavAsty/SASL GitHub Wiki

##挑战应答认证机制(Challenge-Response Authentication Mechanism)CRAM 和CRAM相联系的认证机制叫做CRAM-MD5

第一个准备回答编码的数据假定了一个随机的字符串,一个时间戳,和一个主机名的全部(有效)名称。没有编码的消息形式必须符合RFC228的msg-id规范。

客户端记录下数据然后返回一个包含了用户名,空格和摘要的字符串。摘要是用有密钥的MD5计算的[KEYED-MD5] (https://tools.ietf.org/html/rfc2195#ref-KEYED-MD5)计算的,这里使用的密钥是初始共享的密钥,而且摘要消息就是时间戳

共享密钥是只有客户端和服务器的字符串。摘要参数应该是一个16字节的值用16进制的形式发送,使用的是小写的ASCII码

当服务器收到客户端的应答的时候,它会验证提供的摘要。如果摘要使正确的,服务器就应该考虑客户端的认证并且做出正确的回应

Keyed MD5的使用不仅提供了更大的安全性,而且避免了明文存储共享密钥

CRAM并不提供保护机制(消息加密)

例子

 S: * OK IMAP4 Server
 C: A0001 AUTHENTICATE CRAM-MD5
 S: PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+     ……(A)
 C: dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw             ……(B)
 S: A0001 OK CRAM authentication successful

这个例子中,共享密钥是 'tanstaaftanstaaf',(A)是[email protected]的BASE64编码,客户端依靠

MD5((tanstaaftanstaaf XOR opad),
            MD5((tanstaaftanstaaf XOR ipad),
            <[email protected]>))

公式计算出摘要的值,ipad和opad的定义在KEYED-MD5文件中,再附上用户名,得到tim b913a602c7eda7a495b4e6e7334d3890,它的BASE64编码便是(B)