【问题标题】:What is the safest way to store a password using Code Igniter?使用 Codeigniter 存储密码的最安全方法是什么?
【发布时间】:2011-08-12 18:39:06
【问题描述】:

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

到目前为止,我正在使用 MD5 进行密码散列,但我在很多地方都读到过,这样做不是一个好习惯。

我应该带什么去?

  1. 使用
  2. 或者我应该使用 bcrypt

另外,如果推荐bcrypt,那么如何配合Code Igniter使用呢?

编辑

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

  1. 密码哈希.php
  2. c/Makefile
  3. c/crypt_private.c

在我的控制器中,我正在使用此代码 -

$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

更新

删除了PasswordHash.php,现在使用SimpleLoginSecure

【问题讨论】:

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


    【解决方案1】:

    使用 bcrypt。这个讨论出现在我的答案的 cmets 中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 语句的原因。

    【讨论】:

    • 那么什么会更好呢?使用 SHA1 还是 bcrypt?
    • @Aniket bcrypt 更加安全。正如我所说,请阅读我的其他答案中的 cmets 以找出原因。简而言之,为 bcrypt 计算彩虹表甚至比 SHA2 都要昂贵得多(注意 SHA1 已经死了,甚至不要去那里,我应该早点说)。
    • @Brad bcrypt 非常好,因为内置了盐,可以节省您创建和存储它的时间。
    • 什么错字?我有同样的错误Missing argument 2 ...
    • dev.myunv.com/articles/secure-passwords-with-phpass 链接也已失效,因此不再有用
    【解决方案2】:

    md5()sha1() 一样易于使用,为什么还要使用它?

    对密码加盐总是一个好主意,因为它有效地消除了Rainbow Table 攻击的威胁

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

    【讨论】:

    • 我不打算使用盐。所以我应该使用 SHA1?
    • 当 sha1 在 php 中如此容易获得时,我认为没有理由使用 md5。
    • 为此我需要再修改我的代码:P 而对于 SHA1,我可以继续用它替换 MD5。
    • CI 具有加密功能,它使用您在配置中设置的加密密钥,将其绑定到您的特定应用程序。因此,只需使用$this->ci->hash($password);,如果它在您的服务器上可用,它将使用 sha1。 CI 文档:codeigniter.com/user_guide/libraries/encryption.html
    • @jondavidjohn 鉴于良好的安全性是多么容易实施,绝对没有理由冒着入侵的风险,因为作为开发人员,无论您的网站多么小,您都不会被打扰。
    【解决方案3】:

    自提出此问题以来,Code Igniter 发生了变化。但是为了一些可能没有接触过 CI 的大量文档或以前没有见过的人的利益,CI 有一个加密类,它使用 PHP 的 Mcrypt 库提供双向数据加密。

    使用以下方法初始化类后:

    $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

    【讨论】:

    • 指定链接的第一段:请勿使用此加密库或任何其他加密库来存储用户密码!密码必须改为散列
    猜你喜欢
    • 2013-02-11
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2013-01-18
    • 2020-09-28
    • 2019-09-15
    • 2011-02-03
    相关资源
    最近更新 更多