3

我目前正在开发一个需要用户帐户的网络项目。该应用程序是服务器端的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 个盐,或者一旦攻击者拥有随机盐和散列密码,所有赌注都没有了?(我认为不是,但值得检查一下我是否什么都不担心......)

4

2 回答 2

1

有人可能以某种方式找到注入代码的方法,或者您错误地将目录打开以供查看,或者有人发现注入黑客并且可以看到系统盐文件或用户数据的论点并没有那么令人信服的理由使用双盐。如果有这样的任何一个,你确实比用户加盐和加密密码列表更担心!

综上所述,双盐解决方案确实更加安全,特别是如果您以外的其他人有可能在您的代码中看到系统盐。想想可能承包商或同事离开的情况。如果他们知道使用的盐和盐渍模式/算法,他们可以创建彩虹表并将其用于您的站点。将第二个随机盐添加到用户记录中可以防止这种情况。

这一切都是关于权衡您的安全措施的价值与某人需要通过合理努力来获得您的安全措施的价值。此外,完全不使用盐或根本不加密而不是完全疏忽比存储我们的基本数据的许多其他不太安全的地方更好。如果没有信用信息、医疗记录、社交安全信息。数字,只是普通的用户信息(电子邮件、地址等),而且你没有计划引入这些数据,单盐可能就足够了。如果您现在不能 100% 确定地做出这个判断,那么更安全的选项会出错。

于 2012-10-01T14:16:48.980 回答
1

这是因为 Ion_Auth 使用 bcrypt - 所以你通常不需要做更多的事情。

此外 - 您可以配置“random_rounds”,这有点像配置中的随机加盐(在一定程度上)。

编辑:您可以查看此 SO 线程以获取有关 bcrypt 和其他类型加密的更多详细信息

于 2012-10-01T14:17:25.340 回答