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)