【问题标题】:Salting in PHP and MySQL在 PHP 和 MySQL 中加盐
【发布时间】:2010-07-20 03:52:24
【问题描述】:

我一直在使用 CodeIgniter 为网站开发登录库。验证码如下:

function signin($username, $password)
{
    $CI =& get_instance();
    $query_auth=$this->db->query('SELECT user_id, banned FROM user WHERE username=? AND password=SHA1(CONCAT(?,salt)) LIMIT 1', array($username, $password));

    if($query_auth->num_rows()!=1)
        return 2;
    else
    {
        if($query_init->row()->banned==1)
            return 3;
        else
        {
            $CI->load->library('session');
            $this->session->set_userdata('gauid', $query_auth->row()->user_id);
            return 1;
        }
    }
}

返回值表示成功、失败或禁止。每个用户都有一个唯一的盐存储在数据库中。

最初我从数据库中获取salt,将用户输入的密码和salt从数据库中用PHP组合起来,然后用组合值再次查询数据库。我认为这会加快速度,因为只需要一次访问数据库并且代码更少。我也认为它同样安全,但是在阅读了对这个问题的最高回复之后 Salting my hashes with PHP and MySQL ...

首先,您的 DBMS (MySQL) 不需要任何支持 加密哈希。你可以做所有 在 PHP 方面,那就是 还有你应该怎么做。

...我开始怀疑是否存在我没​​有发现的安全问题。

这段代码真的有什么问题吗?

【问题讨论】:

  • 我不明白这是怎么回事!问题完全不同。
  • 那它应该因为过于本地化而关闭。
  • 对不起,我不明白你的意思。你能解释一下吗?
  • @briggins5 平均每周有大约 3 个与设置密码有关的问题。如果您认为存在安全问题,那么您应该阅读其中一篇文章,而不是添加更多冗余。

标签: php mysql security salt


【解决方案1】:

本身没有任何问题。请记住,任何携带未加密/未散列密码的流量都是可疑的。因此,例如,当服务器是远程服务器,并且在与该服务器通信时未使用加密,则又是尝试拦截密码的时刻。此外,如果查询记录在某处(默认情况下,或者因为它们很慢),那么您有一个纯密码+您正在使用的盐坐在这些服务器日志中,毕竟您遇到了不存储纯文本密码的所有麻烦某处。如果您在自己的代码中私下执行此操作,则不会发生。

这完全取决于你喜欢多偏执。有更容易滥用和经常被遗忘的邪恶,比如会话固定。

【讨论】:

  • 对不起,这本身就是个小问题。 :)
  • 只要您已经考虑过这样的安全问题,我不会将所有密码尝试的明文记录称为小事。否则如上所述。
  • @Joseph Mastey 和@The Rook:你们都是对的(尽管主题完全不同,但这只是节省时间:))
猜你喜欢
  • 1970-01-01
  • 2015-07-04
  • 2014-06-10
  • 2011-08-07
  • 1970-01-01
  • 2014-05-03
  • 2014-03-04
  • 2012-12-22
  • 2018-01-18
相关资源
最近更新 更多