【问题标题】:How to generate password salt with codeigniter如何使用 codeigniter 生成密码盐
【发布时间】:2014-09-08 09:07:29
【问题描述】:

对不起,我是php编程新手,在我的旧项目中,我使用MD5来加密密码,但是它不够安全,我在互联网上找到了一些资源建议使用密码salt。

问题是,我正在使用 codeigniter,是否有任何帮助/库用于此目的/如何更改我的旧代码以支持密码盐的生成?

感谢您的帮助。我正在使用 PHP 5.2

这是验证的旧代码,而用户帐户通过存储md5($password);生成

function validate_credentials() {
        $this->load->model('Secure_model');

        $username = $this->input->post('username');
        $password = md5($this->input->post('password'));

        $is_valid = $this->Secure_model->validate('customer', $username, $password);

        if ($is_valid) {
            $data = array(
                'user_id' => $this->get_user_id($username),
                'user_name' => $username,
                'is_logged_in_user' => true
            );
            $this->session->set_userdata($data);
            redirect('profile');
        } else {
            $data['message_error'] = TRUE;
            $data['main_content'] = 'front/login';
            $this->load->view('front/includes/template', $data);
        }
    }

【问题讨论】:

  • 我发现我也需要将盐存储在数据库中,这个教程sunnyis.me/blog/secure-passwords是否适合我的要求?非常感谢
  • 不要将盐存储在数据库中!如果有人设法转储数据库,他们将使用盐。它与不使用任何盐基本相同。
  • 感谢您的回复,从那个教程看来我什至不需要储存盐。只是像 md5 一样编码但是 phppass 中的每条记录的盐是不稳定的吗?
  • @DannyThunder - 使用每个密码唯一的盐,攻击者必须为每个密码构建一个彩虹表,这没有意义(暴力破解更快)。所以盐的目的是防止使用一个彩虹表来一次获取所有密码。你可能想到的是胡椒或钥匙。如果你有兴趣可以看看我关于safely storing passwords的教程。
  • @martinstoeckli 那部分我明白,它在我不明白的数据库中存储盐。当然如果它是一个不同的数据库。将检查您的页面!谢谢,

标签: php codeigniter security password-protection password-encryption


【解决方案1】:

如果你真的坚持使用 PHP 5.2,你最好的选择可能是phpass 库,因为 BCrypt 算法不支持 PHP。

PHP 5.3 及更高版本将原生支持 BCrypt,因此您可以使用 PHP 函数 password_hash() 对密码进行哈希处理。 5.5 之前的版本有一个compatibility pack

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

在任何情况下,您都可以正确地丢弃 MD5 并切换到另一种算法。确保您使用具有成本因子的算法,如 BCrypt 或 PBKDF2,SHA* 等快速算法适合散列密码。加盐是强制性的,虽然盐可以存储在数据库中,即使它是已知的,它也能实现其目的。

【讨论】:

    【解决方案2】:

    看看我用来注册用户的这部分代码:

    public function addUser($data){
    $sql = "INSERT INTO `user` salt=" . $this->db->escape($salt = substr(md5(uniqid(rand(), true)), 0, 9)) .", password=".$this->db->escape(sha1($salt . sha1($salt . sha1($data['password'])))).".......";
    $this_>db->query($sql);
    

    盐和密码的信息存储在您的用户表中。 要检索信息并验证密码,请执行以下操作:

    $query = $this->CI->db->query("SELECT * FROM `user` WHERE email =".$this->CI->db->escape($email)." AND password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1(" . $this->CI->db->escape($password) . ")))))");
    

    【讨论】:

      【解决方案3】:

      这里有一些简单的解决方案。

      • 你可以使用sha*哈希函数,使用md5时要小心,因为它有一个 冲突率高于sha

      • 还有关于你的盐问题,如果你不加盐也没关系 密码,只需确保您的用户使用非常好的密码,并结合 大小写和数字,并使其冗长。

      我想建议您使用bcrypt,但由于您使用的是5.2,因此该版本和某些密码库(如PHPPASSPHPLIB 仅适用于5.3 及更高版本)存在错误。最好的选择是升级到5.3 以便您可以使用 php 库,但要小心谨慎使用脚本。

      【讨论】:

        【解决方案4】:

        据我所知,codeigniter 没有内置函数...

        要使用 PHP 进行哈希处理,您需要

        • 密码
        • 真正的随机盐
        • 一种慢速哈希算法

        通过 PHP,您可以使用 mcrypt_create_iv() 创建真正的随机盐。

        要生成哈希,您可以使用crypt()password_hash,它们支持慢速算法,例如CRYPT_BLOWFISH。忘记 md5 或 sha1,它们太快了,所以使用适当的工具可以找出它们散列的密码。

        $salt = mcrypt_create_iv(22, MCRYPT_DEV_URANDOM);
        $hash = password_hash($password, PASSWORD_BCRYPT, array('cost' => 11, 'salt' => $salt));
        

        password_hash() 函数可以自动生成一个真正的随机盐,所以如果你不想,你不必手动生成它。 salt 将附加到哈希中。

        可悲的是 PHP 5.2 does not have CRYPT_BLOWFISH support。所以你必须使用PHPASS lib。

        【讨论】:

        • 如果你可以使用password_hash()函数,最好不要自己生成盐,这是由函数本身安全完成的。
        • 可以储存盐吗?如果我想迁移到另一台服务器怎么办,盐会丢失吗?它们依赖于环境吗?
        • 生成的哈希值会将盐包含在明文中,这是存储盐的常用方法。函数password_verify() 将从这个哈希中提取盐。我试图用另一个answer来解释这种格式。
        • 谢谢!我不知道,我总是将盐存放在单独的列中。
        【解决方案5】:

        你应该在你的配置文件中设置一个 $config['salt] = '$%#~De@';//

        //在你的模型或控制器中获取你的帖子值 $password = sha1($this->config->item('salt').$this->input->post->('password')));

        这应该给你密码

        【讨论】:

          猜你喜欢
          • 2018-11-30
          • 1970-01-01
          • 1970-01-01
          • 2020-07-09
          • 1970-01-01
          • 2015-10-23
          • 2012-11-19
          • 2013-12-20
          • 2017-10-23
          相关资源
          最近更新 更多