如何使用不同的身份验证机制安全地存储密码

时间:2011-11-23 07:57:03

标签: javascript security encryption sasl

对于一个有趣的项目,我想支持SASL机制进行身份验证,尤其是PLAIN和DIGEST-MD5。

我的问题是:如果我需要支持这两种身份验证方式,如何安全地存储用户密码?

只有PLAIN身份验证才会非常简单,我只需使用bcrypt存储密码,并使用bcrypt_compare函数将用户提交的密码与存储的密码进行比较。

但是,如果DIGEST-MD5应该可以安全存储密码怎么办呢? 我应该存储整个计算的响应并将其用于PLAIN比较吗? 或者还有其他方式吗?

//编辑:关于“有趣”的项目。目前它是一个有趣的项目,但没有人知道它在某个时候是否会是一个非有趣的项目。而且我不想因为这是一个有趣的项目而降低安全性。

2 个答案:

答案 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);
}

请参阅Secure hash and salt for PHP passwords