我正在制作一个登录页面,我需要使用CodeIgniter帮助访问数据库中的哈希密码。
我的hashPassword函数是
function hashPassword($pass, $passKey){
$key = base64_decode($passwordKey);
return base64_encode(hash_hmac(
'sha256',
$key . mb_convert_encoding($password, 'UTF-16LE', 'ASCII'),
$key, true));
}
我必须做以下事情:
- 使用
username
从my_aspnet_Users
表中提取用户的id
- 使用id 从
- 检查
password
是否等于hashPassword(<password entered by user>, passwordKey)
,以确定输入的密码是否有效。
my_aspnet_Membership
中提取password
和passwordKey
所以我有两个模型:
Class Password extends CI_Model{
function getPassword($password, $passwordKey){
$this -> db -> select ('userId, Password, PasswordKey');
$this -> db -> from ('my_aspnet_Membership');
$this -> db -> where ('Password = '. "'" . $password . "'");
$this -> db -> where ('PasswordKey = '. "'" . $passwordKey . "'");
$q = $this -> db -> get();
if ($q -> num_rows() == 1){
return $q ->result();}else{
return false;
}
}
}
和. .
Class User extends CI_Model{
function getUser($id){
$this -> db -> select('id, name ');
$this -> db -> from('my_aspnet_Users');
$this -> db -> where('id = '. "'". $id . "'");
$this -> db -> limit(1);
$query = $this -> db -> get();
if($query -> num_rows() == 1){
return $query->result();
}
else{
return false;
}
}
}
我只是不知道如何使它们一起工作来执行密码检查
首先,对您的设计提出几点意见。
- 您不需要两个表——一个用于用户,一个用于成员。您只需要一个用户表,其中包含一列来存储密码哈希值。
- SHA256是一个通用哈希函数。使用bcrypt代替。
class User extends CI_Model
function getHash($password) {
/* Code to get hash */
return $passwordHash;
}
function validateUser($username, $password) {
$passwordHash = $this->getHash($password);
/* Query MySQL
select * from user
where
username = $username and
password_hash = $passwordHash
*/
if num_rows > 1
return true
else
return false
}
}
如果没有用户名选项,则在查询中使用用户id/用户电子邮件(任何唯一标识用户的内容)。
只需重用相同的函数(顺便说一下,这非常复杂)。如果我创建一个账户你在存储之前对我的密码运行functionX()只需对登录时输入的密码运行functionX()看看数据库中是否存在输入的用户名?
编辑:我认为你这里的主要问题是你需要一个用户名/电子邮件字段来确认用户与输入的密码相同。尽管
CodeIgniter使用一个名为"Tank Auth"的库:http://konyukhov.com/soft/tank_auth/
它包括类"PasswordHash.php": http://bit.ly/1gahwtT
示例代码:
require "PasswordHash.php";
define("phpass_hash_portable",TRUE);
define("phpass_hash_strength",8);
$hasher = new PasswordHash(phpass_hash_strength,phpass_hash_portable);
if ($hasher->CheckPassword($password_to_check, $original_encoded_password)) {
echo "password correct";
} else {
echo "password incorrect";
}