我正在使用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);
编辑 - 我对数据库的输入很简单......我认为没有理由遇到问题。 ...仍然无法解码或password_verify。仍然不知道这个问题。这是一个简单的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);
}
答案 0 :(得分:0)
直接在数据库中存储密码是违反安全做法的,即使加密也是如此。如果有人可以访问您的服务器,则可以同时获取数据库的代码和快照,并查找您网站上注册的所有用户的密码。关于密码的最佳实践是保存密码的哈希值(最好是SHA256或更强),并将用户在登录表单中输入的密码的哈希值与存储在数据库中的密码进行比较。或者,更好的是,您可以使用PHP内置的密码哈希支持(http://php.net/manual/en/ref.password.php)。
间接地,哈希密码将解决您的问题:)