使用Code Igniter存储密码最安全的方法是什么?

时间:2011-08-12 18:39:07

标签: codeigniter password-protection salt bcrypt password-hash

我正在为我当前的项目使用Code Igniter。

截至目前,我正在使用 MD5 进行密码哈希,但我已经在很多地方阅读过,这样做并不是一个好习惯。

我该怎么办?

  1. 使用 salt
  2. 或者我应该使用 bcrypt
  3. 此外,如果建议使用 bcrypt ,那么如何将其与Code Igniter一起使用?

    修改

    我已将这些文件放在application/libraries

    1. PasswordHash.php
    2. C /生成文件
    3. C / crypt_private.c
    4. 在我的控制器中,我正在使用此代码 -

      $params = array(
             'phpass_hash_strength' => 8,
                 'phpass_hash_portable' => FALSE
             );
      $this->load->library('PasswordHash', $params);
      $password = $this->passwordhash->HashPassword($pwd);
      

      我收到这些错误 -

      A PHP Error was encountered
      
      Severity: Notice
      
      Message: Uninitialized string offset: 3
      
      Filename: libraries/PasswordHash.php
      
      Line Number: 116
      

      A PHP Error was encountered
      
      Severity: Warning
      
      Message: strpos() [function.strpos]: Empty delimiter
      
      Filename: libraries/PasswordHash.php
      
      Line Number: 116
      

      更新

      现在使用 SimpleLoginSecure 删除了PasswordHash.php

3 个答案:

答案 0 :(得分:16)

使用bcrypt。在我的回答评论中,here进行了讨论。您可以使用phppass等库来真正简化密码加密。

关于盐问题。用它!否则,有人可以直接转到this site并下载彩虹表,这些表将涵盖普通用户选择的绝大多数密码。特别是在过去几个月的所有安全漏洞中,现在不是时候说你不会使用像随机盐一样简单的实现。

<强>更新

要将PHPPass与CI配合使用,请从上面链接的phppass网站下载并解压缩文件。将PasswordHash.php文件放入CI应用程序/库目录。

在您的代码中,您可以通过以下方式加载库:$this->load->library('PasswordHash',array(8, FALSE));

哈希密码就像$this->PasswordHash->HashPassword($password);

一样简单

要稍后检查密码是否正确,它就像:

一样简单
$password = $_POST['password'];
$actualPassword = /*Get the hashed password from your db*/;

$check = $this->PasswordHash->CheckPassword($password, $actualPassword);

我从http://dev.myunv.com/articles/secure-passwords-with-phpass/采用了这个演示,它为您提供了更多信息。我稍微修改了该教程以利用CI的加载器,这就是为什么你不需要includenew语句。

答案 1 :(得分:5)

为什么在sha1()使用md5()时使用{{1}}?

同样腌制密码总是一个好主意,因为它有效消除了Rainbow Table攻击的威胁

根据我的经验,对于99%的Web应用程序情况,salted SHA1哈希是非常安全的。

答案 2 :(得分:3)

自提出此问题以来,代码点火器已发生变化。但是为了一些可能没有遇到CI的大量文档或者之前没有看到过这种情况的人的利益,CI有一个加密类,它使用Mcrypt PHP库提供双向数据加密。

使用以下方法初始化课程后

$this->load->library('encrypt');

您可以按如下方式加密:

$msg = 'My secret message';
$encrypted_string = $this->encrypt->encode($msg);

并解密如下:

$encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';
$plaintext_string = $this->encrypt->decode($encrypted_string);
CI还具有不可解码的单向散列:

$hash = $this->encrypt->sha1('Some string');

有关更多信息,请参阅: http://www.codeigniter.com/user_guide/libraries/encryption.html