对于一个有趣的项目,我想支持SASL机制进行身份验证,尤其是PLAIN和DIGEST-MD5。
我的问题是:如果我需要支持这两种身份验证方式,如何安全地存储用户密码?
只有PLAIN身份验证才会非常简单,我只需使用bcrypt存储密码,并使用bcrypt_compare函数将用户提交的密码与存储的密码进行比较。
但是,如果DIGEST-MD5应该可以安全存储密码怎么办呢? 我应该存储整个计算的响应并将其用于PLAIN比较吗? 或者还有其他方式吗?
//编辑:关于“有趣”的项目。目前它是一个有趣的项目,但没有人知道它在某个时候是否会是一个非有趣的项目。而且我不想因为这是一个有趣的项目而降低安全性。
答案 0 :(得分:1)
DIGEST-MD5 specification告诉您服务器需要为该身份验证方法存储的内容:
3.9存储密码
摘要式身份验证需要验证代理 (通常是服务器)存储从用户名称派生的一些数据 和密码在与给定领域相关联的“密码文件”中。 通常,这可能包含由用户名和
H({ username-value, ":", realm-value, ":", passwd })
组成的对,即 如上所述,无需直接计算H(A1)
暴露用户密码。
...所以你需要为DIGEST-MD5存储H({ username-value, ":", realm-value, ":", passwd })
。
您可以单独存储用于PLAIN
身份验证的bcrypt哈希,或者您可以使用DIGEST-MD5值。如果您存储了单独的值,那么您可以允许您的用户有选择地关闭DIGEST-MD5身份验证,这将允许您从这些用户的数据库中删除(易于强制)信息。
答案 1 :(得分:0)
请勿以简单方式存储密码。使用哈希将哈希和同步存储在两者中。您可以使用普通密码轻松获取哈希值。
以下是如何创建一个好的哈希:
function hash_password($password, $nonce) {
global $site_key;
return hash_hmac('sha512', $password . $nonce, $site_key);
}