我正在 Codeigniter 框架内使用 php 制作一个小型登录系统。我使用加密类对密码进行编码,存储在数据库中。然后在登录时,使用他们的用户名找到他们的加密密码,然后将其与他们输入的密码进行匹配。密码在注册过程中被编码。在下面的代码中,我已经能够从数据库中打印出编码的密码,但是每当我通过解码运行它时,它就会失败。但没有错误消息,什么也没有。
public function check_pw(){
//post username and password to database
$data['username'] = $this->input->post('username');
$data['password'] = $this->input->post('password');
$this->load->model('lindsdata');
//encoded password returned from database - this is working
$return_data = $this->lindsdata->password($data);
//$return_data = $this->encrypt->decode($return_data);
//print_r shows $return_data does hold the encrypted password
//but when I uncomment the line with decode in it, $return_data print_rs nothing.
print_r($return_data);
if ($return_data == $data['password']) {
redirect('/update/user', 'location');
}
if($return_data !== $data['password']){
//at this point, $return_data of course still has nothing
print_r($return_data);
//print_r below is the entered password by user..that shows up.
print_r($data['password']);
$error['the_error'] = 'Your Credentials are wrong';
}else{
$error['the_error'] = '';
}
}
我在下面尝试了这个以确保内容被正确编码...这按预期返回了“测试”。
$a = "test";
$test = $this->encrypt->encode($a);
$test = $this->encrypt->decode($test);
print_r($test);
为了进一步让我困惑......我最初手动编码了一个密码(如上面的代码),并将结果与用户一起放入数据库中(我还没有设置注册表单,只是这样做了,所以我有一位用户与之合作)...由于某种原因,该用户工作正常。其他编码的用户密码都不起作用。我不明白为什么他们在解码过程中失败。数据库设置为 varchar(255)。当我通过解码运行它时,我肯定会得到编码的密码......但然后什么也没有。没有错误消息或任何东西,非常难倒。谢谢它提前。 ...我没有发布模型,因为我认为它不相关,因为这确实返回了编码密码以进行检查。
编辑 - $return_data 从数据库打印哈希值,$password 返回正确的密码,但 $pw 没有返回任何内容,这是没有意义的。 ...我的 SQL 数据库是否会以某种方式损坏/编辑我的哈希值?据我所知,这应该可行。
$data['username'] = $this->input->post('username');
$password = $this->input->post('password');
$this->load->model('lindsdata');
$return_data = $this->lindsdata->password($data);
print_r($return_data);
print_r($password);
$pw = password_verify($password, $return_data);
print_r($pw);
编辑 - 我对数据库的输入非常简单...我认为没有理由出现问题。 ...解码或密码验证仍然失败。还是不知道问题所在。这是一个简单的Mysql数据库...
public function register_submit(){
$data['user_name'] = $this->input->post('user_name');
$pwd = $this->input->post('password');
$data['password'] = password_hash($pwd, PASSWORD_DEFAULT);
$this->load->model('lindsdata');
$this->lindsdata->register($data);
}
function register($data){
$this->db->insert('cred', $data);
}
最佳答案
直接将密码存储在数据库中是违反安全实践的,即使已加密。如果有人访问您的服务器,它可以获取代码和数据库快照,并找出在您网站上注册的所有用户的密码。关于密码的最佳实践是保存密码的哈希值(最好是 SHA256 或更强),并将用户在登录表单中输入的密码的哈希值与数据库中存储的密码进行比较。或者,更好的是,您可以使用 PHP 内置的密码哈希支持 ( http://php.net/manual/en/ref.password.php )。
间接地,对密码进行哈希处理将解决您的问题:)
关于php - Codeigniter 解码不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29397554/