1

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

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

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

但是,当 DIGEST-MD5 也应该是可能的时候,我怎样才能安全地存储密码呢?我是否应该存储整个计算的响应并将其也用于 PLAIN 比较?还是有其他方法?

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

4

2 回答 2

1

DIGEST-MD5 规范告诉您服务器需要为该身份验证方法存储什么:

3.9 存储密码

摘要式身份验证要求身份验证代理(通常是服务器)将一些从用户名和密码派生的数据存储在与给定领域关联的“密码文件”中。通常这可能包含由 username 和 组成的对H({ username-value, ":", realm-value, ":", passwd }),这足以H(A1) 如上所述计算而无需直接暴露用户的密码。

...所以您需要为 DIGEST-MD5 存储的只是H({ username-value, ":", realm-value, ":", passwd }).

您可以单独存储一个 bcrypt 散列以用于PLAIN身份验证,或者您可以只使用 DIGEST-MD5 值。如果您存储了单独的值,那么您可以允许您的用户有选择地关闭 DIGEST-MD5 身份验证,这将允许您从数据库中为这些用户删除该(容易被暴力破解的)信息。

于 2011-11-30T05:03:12.473 回答
0

不要以明文形式存储密码。存储散列并与散列比较。您可以使用普通密码轻松获取哈希值。

这里是如何创建一个好的哈希:

function hash_password($password, $nonce) {
  global $site_key;
  return hash_hmac('sha512', $password . $nonce, $site_key);
}

请参阅PHP 密码的安全哈希和盐

于 2011-11-23T08:01:49.190 回答