我目前正在从事一个需要用户帐户的网络项目。该应用程序在服务器端是 CodeIgniter,因此我使用 Ion Auth 作为身份验证库。
我以前写过一个身份验证系统,我用了两种盐来保护密码。一个是服务器范围的盐,作为 .htaccess 文件中的环境变量,另一个是在用户注册时创建的随机生成的盐。
这是我在该身份验证系统中用于散列密码的方法:
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
//create a random string to be used as the random salt for the password hash
$size = strlen($chars);
for($i = 0; $i < 22; $i++) {
$str .= $chars[rand(0, $size - 1)];
}
//create the random salt to be used for the crypt
$r_blowfish_salt = "$2a$12$" . $str . "$";
//grab the website salt
$salt = getenv('WEBSITE_SALT');
//combine the website salt, and the password
$password_to_hash = $pwd . $salt;
//crypt the password string using blowfish
$password = crypt($password_to_hash, $r_blowfish_salt);
我不知道这是否有漏洞,但无论如何,我转向 Ion Auth 以获得更完整的功能集以与 CI 一起使用。
我注意到 Ion 仅使用单一盐作为其哈希机制的一部分(尽管建议设置 encryption_key 以保护数据库 session 。)
将存储在我的数据库中的信息包括姓名、电子邮件地址、国家/地区位置、一些注释(建议它们不包含敏感信息)以及指向 Facebook、Twitter 或 Flickr 的链接帐户。基于此,我不认为我有必要在我网站的安全页面上建立 SSL 连接。
我的问题是,为什么只使用一种盐作为 Ion Auth 库的一部分是否有特殊原因?这是否暗示我在它提供的功能之前编写了自己的额外加盐,或者我是否遗漏了什么?
此外,是否值得使用 2 个盐,或者一旦攻击者获得了随机盐和散列密码,所有的赌注都会被取消吗? (我假设不是,但值得检查一下我是否担心什么......)
最佳答案
这是因为 Ion_Auth 使用 bcrypt - 所以您通常不需要做更多的事情。
此外 - 您可以配置“random_rounds”,这有点像配置中的随机加盐(在一定程度上)。
编辑:你可以view this SO thread有关 bcrypt 和其他类型加密的更多详细信息
关于php - 关于低敏感度用户帐户的双盐认证的意见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674756/