12

我正在为我当前的项目使用 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

4

3 回答 3

16

使用 bcrypt。这个讨论出现我的回答的评论中。您可以使用phppass之类的库来真正简化密码加密。

关于盐的问题。用它!否则,有人可以简单地访问该站点并下载彩虹表,该表将涵盖普通用户选择的大部分密码。尤其是在过去几个月的所有安全漏洞中,现在不是说您不会使用像随机盐这样简单实现的东西的时候。

更新

要将 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 的加载器,这就是您不需要includeornew语句的原因。

于 2011-08-12T19:01:07.590 回答
5

为什么要使用md5()它同样易于使用sha1()

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

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

于 2011-08-12T18:48:50.590 回答
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

于 2015-01-06T03:33:17.310 回答