我目前正在开发一个需要用户帐户的网络项目。服务器端的应用程序为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种盐,或者一旦攻击者拥有随机盐和散列密码,那么所有赌注都会被打掉? (我假设没有,但值得检查一下,如果我什么都不担心......)
答案 0 :(得分:1)
有人可能会以某种方式找到注入代码的方法,或者您错误地将目录打开以查看,或者有人发现注入黑客并且可以看到系统salt文件或用户数据并不是那么引人注目的论点使用双盐的原因。如果其中任何一个,确实比用户盐渍和加密密码列表更令人担心!
所有这一切,双盐解决方案确实更加安全,特别是如果除了你之外的其他人可能会在你的代码中看到系统盐。想想承包商或同事离开的情况。如果他们知道所使用的盐和盐渍模式/算法,他们可以创建彩虹表并将其用于您的站点。将第二个随机盐添加到用户记录中可以防止这种情况发生。
所有这一切都是为了权衡你的安全价值与某人为获得你的安全所需要的合理努力量。而且,根本不完全疏忽完全不使用盐或根本不加密,这比我们存储基本数据的许多其他不太安全的地方要好得多。如果它没有信用信息,医疗记录,社交秒。数字,只是香草用户信息(电子邮件,地址等...),你没有计划引入这些数据,单盐可能就足够了。如果您现在无法100%确定地进行此判断,请选择更安全的选项。
答案 1 :(得分:1)
因为Ion_Auth使用了bcrypt - 所以你通常不需要做更多的事情。
此外 - 您可以配置“random_rounds”,这有点像配置中的随机腌制(在某种程度上)。
编辑:您可以view this SO thread了解有关bcrypt和其他类型加密的详细信息