- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
只想用PHPass在 Codeigniter 中对密码进行哈希处理。我从 phpass 网站下载了 zip 文件,提取了内容,并将 PasswordHash.php 文件复制到我的库文件夹中。
然后我将该库加载到我的 Controller 中并尝试散列密码,但它给出了以下错误
Missing argument 1 for PasswordHash::PasswordHash(), called in ...
Missing argument 2 for PasswordHash::PasswordHash(), called in ...
Undefined variable: iteration_count_log2 ...
Undefined variable: portable_hashes ...
请检查下面我的 Controller 代码并帮助我找出错误:
$this->load->library('PasswordHash');
$password = $this->input->post('password');
$hash = $this->passwordhash->HashPassword( $password );
最佳答案
这是我的做法。首先将其创建为助手。
<?php (defined('BASEPATH')) OR exit('No direct script access allowed');
#
# Portable PHP password hashing framework.
#
# Version 0.3 / genuine.
#
# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in
# the public domain. Revised in subsequent years, still public domain.
#
# There's absolutely no warranty.
#
# The homepage URL for this framework is:
#
# http://www.openwall.com/phpass/
#
# Please be sure to update the Version line if you edit this file in any way.
# It is suggested that you leave the main version number intact, but indicate
# your project name (after the slash) and add your own revision information.
#
# Please do not change the "private" password hashing method implemented in
# here, thereby making your hashes incompatible. However, if you must, please
# change the hash type identifier (the "$P$") to something different.
#
# Obviously, since this code is in the public domain, the above are not
# requirements (there can be none), but merely suggestions.
#
class PasswordHash {
var $itoa64;
var $iteration_count_log2;
var $portable_hashes;
var $random_state;
function PasswordHash($iteration_count_log2, $portable_hashes)
{
$this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
$iteration_count_log2 = 8;
$this->iteration_count_log2 = $iteration_count_log2;
$this->portable_hashes = $portable_hashes;
$this->random_state = microtime();
if (function_exists('getmypid'))
$this->random_state .= getmypid();
}
function get_random_bytes($count)
{
$output = '';
if (is_readable('/dev/urandom') &&
($fh = @fopen('/dev/urandom', 'rb'))) {
$output = fread($fh, $count);
fclose($fh);
}
if (strlen($output) < $count) {
$output = '';
for ($i = 0; $i < $count; $i += 16) {
$this->random_state =
md5(microtime() . $this->random_state);
$output .=
pack('H*', md5($this->random_state));
}
$output = substr($output, 0, $count);
}
return $output;
}
function encode64($input, $count)
{
$output = '';
$i = 0;
do {
$value = ord($input[$i++]);
$output .= $this->itoa64[$value & 0x3f];
if ($i < $count)
$value |= ord($input[$i]) << 8;
$output .= $this->itoa64[($value >> 6) & 0x3f];
if ($i++ >= $count)
break;
if ($i < $count)
$value |= ord($input[$i]) << 16;
$output .= $this->itoa64[($value >> 12) & 0x3f];
if ($i++ >= $count)
break;
$output .= $this->itoa64[($value >> 18) & 0x3f];
} while ($i < $count);
return $output;
}
function gensalt_private($input)
{
$output = '$P$';
$output .= $this->itoa64[min($this->iteration_count_log2 +
((PHP_VERSION >= '5') ? 5 : 3), 30)];
$output .= $this->encode64($input, 6);
return $output;
}
function crypt_private($password, $setting)
{
$output = '*0';
if (substr($setting, 0, 2) == $output)
$output = '*1';
$id = substr($setting, 0, 3);
# We use "$P$", phpBB3 uses "$H$" for the same thing
if ($id != '$P$' && $id != '$H$')
return $output;
$count_log2 = strpos($this->itoa64, $setting[3]);
if ($count_log2 < 7 || $count_log2 > 30)
return $output;
$count = 1 << $count_log2;
$salt = substr($setting, 4, 8);
if (strlen($salt) != 8)
return $output;
# We're kind of forced to use MD5 here since it's the only
# cryptographic primitive available in all versions of PHP
# currently in use. To implement our own low-level crypto
# in PHP would result in much worse performance and
# consequently in lower iteration counts and hashes that are
# quicker to crack (by non-PHP code).
if (PHP_VERSION >= '5') {
$hash = md5($salt . $password, TRUE);
do {
$hash = md5($hash . $password, TRUE);
} while (--$count);
} else {
$hash = pack('H*', md5($salt . $password));
do {
$hash = pack('H*', md5($hash . $password));
} while (--$count);
}
$output = substr($setting, 0, 12);
$output .= $this->encode64($hash, 16);
return $output;
}
function gensalt_extended($input)
{
$count_log2 = min($this->iteration_count_log2 + 8, 24);
# This should be odd to not reveal weak DES keys, and the
# maximum valid value is (2**24 - 1) which is odd anyway.
$count = (1 << $count_log2) - 1;
$output = '_';
$output .= $this->itoa64[$count & 0x3f];
$output .= $this->itoa64[($count >> 6) & 0x3f];
$output .= $this->itoa64[($count >> 12) & 0x3f];
$output .= $this->itoa64[($count >> 18) & 0x3f];
$output .= $this->encode64($input, 3);
return $output;
}
function gensalt_blowfish($input)
{
# This one needs to use a different order of characters and a
# different encoding scheme from the one in encode64() above.
# We care because the last character in our encoded string will
# only represent 2 bits. While two known implementations of
# bcrypt will happily accept and correct a salt string which
# has the 4 unused bits set to non-zero, we do not want to take
# chances and we also do not want to waste an additional byte
# of entropy.
$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$output = '$2a$';
$output .= chr(ord('0') + $this->iteration_count_log2 / 10);
$output .= chr(ord('0') + $this->iteration_count_log2 % 10);
$output .= '$';
$i = 0;
do {
$c1 = ord($input[$i++]);
$output .= $itoa64[$c1 >> 2];
$c1 = ($c1 & 0x03) << 4;
if ($i >= 16) {
$output .= $itoa64[$c1];
break;
}
$c2 = ord($input[$i++]);
$c1 |= $c2 >> 4;
$output .= $itoa64[$c1];
$c1 = ($c2 & 0x0f) << 2;
$c2 = ord($input[$i++]);
$c1 |= $c2 >> 6;
$output .= $itoa64[$c1];
$output .= $itoa64[$c2 & 0x3f];
} while (1);
return $output;
}
function HashPassword($password)
{
$random = '';
if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) {
$random = $this->get_random_bytes(16);
$hash =
crypt($password, $this->gensalt_blowfish($random));
if (strlen($hash) == 60)
return $hash;
}
if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) {
if (strlen($random) < 3)
$random = $this->get_random_bytes(3);
$hash =
crypt($password, $this->gensalt_extended($random));
if (strlen($hash) == 20)
return $hash;
}
if (strlen($random) < 6)
$random = $this->get_random_bytes(6);
$hash =
$this->crypt_private($password,
$this->gensalt_private($random));
if (strlen($hash) == 34)
return $hash;
# Returning '*' on error is safe here, but would _not_ be safe
# in a crypt(3)-like function used _both_ for generating new
# hashes and for validating passwords against existing hashes.
return '*';
}
function CheckPassword($password, $stored_hash)
{
$hash = $this->crypt_private($password, $stored_hash);
if ($hash[0] == '*')
$hash = crypt($password, $stored_hash);
return $hash == $stored_hash;
}
}
/* End of file phpass_helper.php */
/* Location: ./application/helpers/phpass_helper.php */
要使用 phpass 助手,加载助手,实例化它,调用 HashPassword 函数:
$this->load->helper('phpass');
$hasher = new PasswordHash(PHPASS_HASH_STRENGTH, PHPASS_HASH_PORTABLE);
$hash_password = $hasher->HashPassword($password);
在config/constants.php中添加如下代码:
/*
|--------------------------------------------------------------------------
| Portable PHP password hashing framework
|--------------------------------------------------------------------------
|
| http://www.openwall.com/phpass/
|
*/
define('PHPASS_HASH_STRENGTH', 8);
define('PHPASS_HASH_PORTABLE', FALSE);
您现在应该也明白为什么会收到关于缺少参数 1 和 2 的错误。当您实例化 PasswordHash 类时,您需要为其提供两个参数。您也可以将 phpass 创建为 CodeIgniter 库文件。只需将函数 PasswordHash 更改为 __constructor 并在调用库时提供两个参数。我会让你自己想办法。
关于php - 在 Codeigniter 中使用 PHPass 散列密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27731446/
我正在创建一项处理大量个人数据的服务,因此让密码直接泄露是不合适的。我一直在四处寻找任何可能的解决方案,引起我注意的一个是 phpass .我确实在 StackOverflow 上通过 here 读到
我已经成功地使用 Phpass 对注册用户密码进行哈希处理并将它们存储在数据库中,现在我卡在了登录名如何检查提交的用户名和密码,检查用户名是否存在于数据库中然后检查哈希密码与给定一个。 非常感谢任何帮
我在插入时使用 phpass 对密码进行哈希处理,如下所示 public function addAdmin(){ $this->load->library('phpass');
长期以来,我一直在使用 PHPass 来散列我的密码。我承认仍然有一些我不完全理解(或忽略)的东西来正确地散列密码,所以今天我正在审查我能找到的所有关于它的信息。 查看 PHPass 文档,我已经介入
我正在查看 SO 上很多答案中推荐的 PHPass 库。但是当我查看生成的密码时,我看到类似这样的内容: 现在其中一些只是 1234,有些更复杂一些。有些真的很复杂(大写、小写、字符)等。但是,我仍然
我正在将网站从 Wordpress 转换为使用 Codeigniter 开发的自定义 CMS。有人告诉我 Wordpress 使用 PHPass 来散列他们的密码,所以我正在使用 PHPass 库(如
我正在使用 PHPASS 来存储加密的密码并在登录时进行比较。 这是代码 ob_start(); $userName = $password = ""; $userNameErr = $passwor
打开“portable_hashes”。我注意到,无论出于何种原因,它生成的哈希值并不总是相同的——但在通过“CheckPassword”传递时始终返回有效值。我还注意到在生成哈希时使用了“PHP_V
我正在阅读 phpass manual .在某些时候,它会像这样检查散列的结果: $hash = $hasher->HashPassword($pass); if (strlen($hash) < 2
phpass 是一种广泛使用的散列“框架”。 在将普通密码提供给 PasswordHash (v0.2) 之前,像这样对普通密码加盐是一种好习惯吗?: $dynamicSalt = $record
我正在尝试在 Yii 中实现 phpass 身份验证,但每次都失败。我已经阅读了很多 SO 文章,但还没有找到解决方案,所以我认为这一定是 Yii 特有的问题。 我在 User.php 中保存散列密码
一直试图在论坛和堆栈的问题中找到解决方案,但没有结果,所以你是我最后的希望。我使用 phpass 进行密码加密,注册脚本工作正常,但是当我尝试登录并使用 CheckPassword 函数时,它总是返回
我的 wordpress 后端使用 phpass 哈希算法并使用网络服务给我 phpass。在 ios 中以 swift 结束我试图在 swift 中生成相同的 phpass 哈希。以下是 swift
只想用PHPass在 Codeigniter 中对密码进行哈希处理。我从 phpass 网站下载了 zip 文件,提取了内容,并将 PasswordHash.php 文件复制到我的库文件夹中。 然后我
我正在尝试使用 phpass 存储我的用户密码,但我很难正确实现它。我有工作代码,但我将密码存储为文本,我知道这是不安全的。根据 phpbestpractices.org,最安全的方法是 phpass
不知不觉中,我实现了一个使用 md5 作为哈希算法的登录系统。现在我知道得更多了,我想转而使用 PHPass。我的问题是该系统已经在生产中,要求所有用户更改他们的密码将是最令人头疼的问题。 我想出了一
我正在努力使用 phpass 在 codeigniter 中正确执行密码哈希。我已经将 phpass 密码哈希文件添加到 codeigniter 的库文件夹中,现在我不知道如何正确编写语句 $t_ha
我有一个散列 Wordpress 密码数据库。我正在尝试根据数据库存储的密码检查用户密码,但哈希值不正确。我正在使用 this github code在 isMatch() 中进行一些登录。知道为什么
我在一家公司工作,我必须将他们的 API 从 Php 重新制作到 Golang。以前的开发人员在 Php 中使用 Phpass,但是,我需要在 Golang 中使用它。 我搜索了如何在 go 中实现
我想使用我自己用 Node.js 编写的身份验证服务对 WP 用户进行身份验证。我已将用户保存在 wp_users 中 table 。他们的密码由 WordPress 使用 Phpass 方法进行哈希
我是一名优秀的程序员,十分优秀!