2015-04-01 68 views
0

我在Codeigniter框架内使用php做了一个小小的登录系统。我使用加密类来编码密码,存储在数据库中。然后在登录时,使用他们的用户名找到他们的加密密码,然后将其与他们输入的密码进行匹配。密码在注册期间被编码。在下面的代码中,我已经能够从数据库中打印编码密码,但是当我通过解码运行它时,它就会失败。但没有错误信息,只是没有。Codeigniter解码不起作用

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打印来自数据库的散列和$密码返回正确的密码,但$ 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

不能产生问题。你的测试代码工作正常 – 2015-04-01 18:44:15

+0

当密码是'test'时,你的数据库插入了什么值; – 2015-04-01 18:50:10

+0

测试我刚刚在浏览器中做过,没有通过数据库运行。但我应该尝试一下。 – 2015-04-01 19:16:53

回答

0

即使加密,直接在数据库中存储密码也是违反安全规范的。如果有人可以访问您的服务器,它可以同时获取数据库的代码和快照,并找出您网站上注册的所有用户的密码。有关密码的最佳做法是保存密码的散列(最好是SHA256或更高),并将用户在登录表单中输入的密码与存储在数据库中的密码进行比较。或者,甚至更好,您可以使用内置密码哈希支持的PHP(http://php.net/manual/en/ref.password.php)。

间接地,哈希密码将解决您的问题:)

+0

啊..在阅读完一小段文字(我对安全性相当新鲜,我一直在使用Codeigniter第三方库Tank Auth来满足我的需求,但是这次决定创建我自己的登录)。所以在我看来,加密和散列之间的区别在于散列没有关键。哈希使用实际的密码字(希望这是有道理的)解密(简而言之)。我有没有得到那个权利?去试试这个散列。谢谢! – 2015-04-01 19:27:32

+0

虽然这个PASSWORD_DEFAULT选项有点困惑。 - PASSWORD_DEFAULT - 使用bcrypt算法(默认为PHP 5.5.0)。请注意,随着新的更强大的算法添加到PHP中,此常量将随时间而改变。出于这个原因,使用这个标识符的结果的长度会随着时间而改变。因此,建议将结果存储在可扩展超过60个字符的数据库列中(255个字符将是一个不错的选择)。 - 我没有得到我存储在数据库中的这个... – 2015-04-01 19:31:42

+0

关于哈希,是的,你可以说不需要密码,但是盐会大大降低某人解码哈希序列的机会。请注意,散列是单向旅程,您可以根据字符串计算散列,但无法从散列计算字符串。如果你想阅读更多关于哈希密码的内容,我会推荐这篇文章:https://crackstation.net/hashing-security.htm – Cristik 2015-04-01 19:41:58