好吧,我一直坐在这里,因为几个小时都在这个问题上摸不着头脑,我不知道出了什么问题。我正在尝试通过带有 crypt 的随机盐来加密密码,但是当我尝试登录时,总是错误的。
让我引导您完成脚本:
$cost = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$salt = sprintf("$2y$%02d$", $cost) . $salt;
$hash = crypt($password, $salt);
echo $hash;
echo crypt($password, $hash);
输出以下密码为“asdfgh”:
$2y$10$865uru.sXJheD9TQKLDnZuTZfpAXv83UDuaSFfb.G2qIxBzEb1pOi
$2y$10$865uru.sXJheD9TQKLDnZuTZfpAXv83UDuaSFfb.G2qIxBzEb1pOi
数据库中的哈希如下所示:
$2y$10$865uru.sXJheD9TQKLDnZuTZfpAXv83UDuaSFfb.G2qIxBzEb1pOi
对于登录脚本,我们有以下代码用于测试目的:
echo $data->hash . '<br>';
echo crypt('asdfgh', $data->hash) . '<br>';
echo crypt('asdfgh', '$2y$10$865uru.sXJheD9TQKLDnZuTZfpAXv83UDuaSFfb.G2qIxBzEb1pOi');
并输出以下内容:
$2y$10$865uru.sXJheD9TQKLDnZuTZfpAXv83UDuaSFfb.G2qIxBzEb1pOi
$2y$10$865uru.sXJheD9TQKLDnZuRRPJQwjWh2PGgtntpcsnRaGzvv5Sfte
$2y$10$865uru.sXJheD9TQKLDnZuRRPJQwjWh2PGgtntpcsnRaGzvv5Sfte
虽然数据库字符串仍然是正确的,即使通过手动将正确的字符串传递给函数,生成的哈希也是不同的。我没有解决方案...
如果有人可以帮助我,我将非常感激。
Windows 上的 PHP 版本 5.4.16
更新:这是带有盐的更新片段:
$cost = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$salt = sprintf("$2y$%02d$", $cost) . $salt;
$hash = crypt($password, $salt);
$data = array(
'id' => '',
'username' => $username,
'hash' => $hash,
'email' => $email,
'salt' => $salt,
);
$this->mdl_registration->_insert($data);
$this->load->view('registration_submit');
对于登录脚本:
function check_login($password) {
$username = $this->input->post('username');
$result = $this->get_where_custom('username', $username);
foreach($result->result() as $data) {
echo $data->hash . '<br>';
echo crypt('asdfgh', $data->salt) . '<br>';
$test = crypt($password, $data->salt);
if($test == $data->hash) {
return TRUE;
}
else {
$this->form_validation->set_message('check_login', 'Invalid Username and / or Password');
return FALSE;
}
}
}
用于测试的回声返回以下内容:
$2y$10$ZgbOXM18lArDu/u/Ftsdr.t7VPnLsqLJdC2Dum8pl/flW8LmnnUoS
$2y$10$ZgbOXM18lArDu/u/Ftsdr.s5N5juHB/zq/5SN/7oFAjn9CZKjI9H6