我目前正在开发一个需要用户帐户的网络项目。该应用程序是服务器端的CodeIgniter,因此我使用Ion Auth作为身份验证库。
我之前写过一个身份验证系统,我使用了 2 个盐来保护密码。一个是服务器范围的盐,它作为 .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 以保护数据库会话。)
将存储在我的数据库中的信息包括姓名、电子邮件地址、国家/地区位置、一些注释(建议不要包含敏感信息)以及 Facebook、Twitter 或 Flickr 帐户的链接。基于此,我不相信我有必要在我网站的安全页面上建立 SSL 连接。
我的问题是,为什么只有 1 种盐被用作 Ion Auth 库的一部分,有什么特别的原因吗?是否暗示我在它提供的功能之前编写了自己的额外加盐,或者我错过了什么?
此外,是否值得使用 2 个盐,或者一旦攻击者拥有随机盐和散列密码,所有赌注都没有了?(我认为不是,但值得检查一下我是否什么都不担心......)