Cryptography 实施CRAM-MD5是个好主意吗?

Cryptography 实施CRAM-MD5是个好主意吗?,cryptography,smtp,Cryptography,Smtp,我正在编写一个SMTP服务器,并实现了CRAM-MD5身份验证。为了计算质询响应字符串,我显然需要在服务器上存储一个明文密码 这背后的原因是什么?这种身份验证机制似乎存在难以置信的缺陷,前提是: CRAM-MD5要求在服务器上存储纯文本密码 CRAM-MD5使用的MD5已损坏 在我看来,如果总是需要TLS,CRAM-MD5似乎比普通/登录身份验证更不安全。当然,如果您只想保留一个不可逆的密码作为CRAM-MD5的密钥,您可以修改CRAM-MD5以使用PBKDF函数(如PBKDF2)的输出。不

我正在编写一个SMTP服务器,并实现了CRAM-MD5身份验证。为了计算质询响应字符串,我显然需要在服务器上存储一个明文密码

这背后的原因是什么?这种身份验证机制似乎存在难以置信的缺陷,前提是:

  • CRAM-MD5要求在服务器上存储纯文本密码
  • CRAM-MD5使用的MD5已损坏

在我看来,如果总是需要TLS,CRAM-MD5似乎比普通/登录身份验证更不安全。

当然,如果您只想保留一个不可逆的密码作为CRAM-MD5的密钥,您可以修改CRAM-MD5以使用PBKDF函数(如PBKDF2)的输出。不过两边都需要盐

然而,这并不是很有用,因为攻击者可能直接使用PBKDF2的输出作为CRAM-MD5的输入。因此,唯一的优势是用户的密码不会直接公开(密码经常被重复使用)。强烈建议在服务器上使用PBKDF2,即使是普通登录,因为它可以减轻数据库受损的影响

当然,将CRAM-MD5版本与KDF一起使用使其成为专有协议,因此互操作性将受到影响

然而,由于检索密码意味着破坏TLS,所以对于大多数用例,普通/登录应该可以


请注意,我不是CRAM-MD5方面的专家,我只是快速阅读了维基百科上的协议。

是的,由于密码重复使用,存储密码,即使是可逆加密的,也比某种盐渍散列更糟糕。可以说,从明文密码(如PBKDF2或常规salted散列)生成一些东西,然后在两侧使用它会更安全一些。但是,它要求客户机了解服务器的哈希方案,包括用于此帐户的salt。无论您如何划分,这都会给您留下一些与CRAM-MD5不兼容的东西,而且不一定会更好

我建议完全因为这个问题和其他问题而忘记CRAM-MD5。特别是,它使用了MD5,这被认为是坏的,并且有。最大的问题是连接没有加密,因此任何人都可以嗅出实际内容


更好的答案是只使用TLS。

您不需要在服务器上存储明文密码,您只需要存储公式的MD5上下文,它是专门为此而设计的:

HMAC(K, M) -> H(K1, H(K2, M))
请注意,K1和K2始终是散列的第一个输入,并且始终为64字节长,无论密钥/密码大小如何,还请注意,此算法与其他散列(SHA1、SHA256等)兼容

来自RFC6151(2011年3月)

MD5不再适用于需要抗碰撞的情况,如数字签名。停止以其他方式使用MD5并不紧急,例如HMAC-MD5

来自RFC2195(1997年9月)

使用[KEYED-MD5]中描述的用于预计算中间结果的技术,通过存储中间结果(称为“上下文”),可以避免在服务器系统上显式明文存储共享秘密


更多信息,真的。对,我不知道安全站点。好吧,现在已经在这里发布了,尽管如此,还是很感谢您的回答/评论。真的只是想再听听您的意见,因为auth方案似乎存在难以置信的缺陷。好吧,因为它本身并没有对服务器进行身份验证,所以它的用途似乎有限,特别是在没有其他方法来识别服务器的情况下。TLS提供了这一点,但在这种情况下,它似乎并没有给表带来太多内容。这将是完全没有意义的:散列密码现在,在所有意图和目的,实际的密码。能够获得散列的攻击者可以作为该用户进行身份验证。我认为@NickJohnson的观点是,同样的论点也适用于以明文形式存储密码。如果您担心服务器密码存储的保密性,那么存储PBKDF就没有帮助;如果你没有,那么通过存储明文密码来保持简单和可互操作性。@JameySharp哦,你当然是对的,没关系,我回家后会更改答案的。非常感谢,你的答案非常重要!:)