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

12

我正在使用Code Igniter开发我的项目。

目前,我正在使用MD5来进行密码哈希处理,但我在很多地方都看到过,这不是一个好的做法。

我应该选什么?

  1. 使用盐值(salt)
  2. 还是应该使用bcrypt

另外,如果bcrypt被建议使用,那么如何在Code Igniter中使用它?

编辑

我把这些文件放在了application/libraries里:

  1. PasswordHash.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

3个回答

16

使用bcrypt。关于此问题,在我的答案评论中有讨论。您可以使用库,例如phppass来简化密码加密。

关于盐的问题。一定要使用它!否则,有人可以轻松地去这个网站下载覆盖大多数普通用户选择的密码的彩虹表。特别是在过去几个月中发生了所有安全漏洞的情况下,现在不是说您不会使用像随机盐这样简单的实现方式的时候。

更新

要在CI中使用PHPPass,请从上面链接的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
那么哪个更好呢?使用SHA1还是bcrypt? - Aniket
1
@Aniket bcrypt非常安全。正如我所说,阅读我其他答案的评论以了解原因。简而言之,计算bcrypt的彩虹表比甚至SHA2都要昂贵得多(请注意,SHA1已经过时,请不要再使用它,我早该说了)。 - Endophage
1
@Brad bcrypt非常好,因为盐已经内置了,这样就不需要创建和存储它了。 - Endophage
1
什么错别字?我也遇到了同样的错误“缺少参数2...” - b_dubb
1
同时,http://dev.myunv.com/articles/secure-passwords-with-phpass/链接已经失效,因此不再有帮助。 - b_dubb
显示剩余10条评论

5
为什么要使用md5(),而不是同样易于使用的sha1()
此外,在密码中添加盐值始终是一个好主意,因为它有效地消除了Rainbow Table攻击的威胁。
在我的经验中,加盐的SHA1哈希对于99%的Web应用程序情况来说已经足够安全。

1
在我看来,当PHP中如此容易获取SHA1时,使用MD5没有任何理由。 - jondavidjohn
2
CI具有加密功能,它使用您在配置中设置的加密密钥,将其绑定到您的特定应用程序。因此,只需使用$this->ci->hash($password);,如果您的服务器上可用sha1,则会使用它。 CI文档:http://codeigniter.com/user_guide/libraries/encryption.html - permawash
@permawash,为了安全起见,您需要随机盐。使用CI的加密密钥作为盐是一个很差的替代品。CI只提供这种用法给那些缺乏经验或太懒以至于无法进行适当的安全措施的人。请查看我的答案和我其他回答的链接,其中讨论了相关问题。 - Endophage
除非他正在构建NSA的新时髦CodeIgniter Web应用程序,否则我怀疑盐SHA1不足以满足需求。 - jondavidjohn
3
考虑到实施良好的安全措施非常简单,因此作为开发者,你因懒惰而冒险遭受入侵是没有任何借口的,无论你的网站大小如何。 - Endophage
显示剩余3条评论

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

8
不要使用此或任何其他加密库来存储用户密码!密码必须使用哈希函数进行加密。 - Starlays

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接