在密码中添加salt

时间:2017-10-11 08:47:03

标签: php

我使用php代码将我的应用程序与localhost连接。我的应用程序注册和登录实际上已经成功,但现在我想在我的密码中添加salt。所以,我按照这个链接:https://www.youtube.com/watch?v=WwxAyiAtrbM在我的应用程序用户密码中实现salt,但是在我添加之后,应用程序无法注册用户。我不知道为什么不能注册。希望得到反馈。下面是我的PHP代码:

<?php 

class DbOperations{

    private $con; 

    function __construct(){

        require_once dirname(__FILE__).'/DbConnect.php';

        $db = new DbConnect();

        $this->con = $db->connect();

    }
    public function encrypt($string, $key){
        $string = rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB)));
    }
    public funtion decrypt($string, $key){
        $string = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($string), MCRYPT_MODE_ECB));
    }
    public funtion hashword($string, $salt){
        $string = crypt($string, '$P$' .$salt . '$');
    }

    /*CRUD -> C -> CREATE */

    public function createUser($user_login, $user_pass,$user_email, $user_registered){
        if($this->isUserExist($user_login,$user_email)){
            return 0; 
        }else{
            $password = hashword($password, $salt);
            $stmt = $this->con->prepare("INSERT INTO `wp_users` (`ID`, `user_login`, `user_pass`,`user_email`,`user_registered`) VALUES (NULL, ?, ?, ?, ?);");
            $stmt->bind_param("ssss",$user_login,$user_pass,$user_email,$user_registered);

            if($stmt->execute()){
                return 1; 
            }else{
                return 2; 
            }
        }
    }

    public function userLogin($user_login, $user_pass){
        $user_pass = md5($user_pass);
        $stmt = $this->con->prepare("SELECT ID FROM wp_users WHERE user_login = ? AND user_pass = ?");
        $stmt->bind_param("ss",$user_login,$user_pass);
        $stmt->execute();
        $stmt->store_result(); 
        return $stmt->num_rows > 0; 
    }

    public function getUserByUsername($user_login){
        $stmt = $this->con->prepare("SELECT * FROM wp_users WHERE user_login = ?");
        $stmt->bind_param("s",$user_login);
        $stmt->execute();
        return $stmt->get_result()->fetch_assoc();
    }


    private function isUserExist($user_login, $user_email){
        $stmt = $this->con->prepare("SELECT ID FROM wp_users WHERE user_login = ? OR user_email = ?");
        $stmt->bind_param("ss", $user_login, $user_email);
        $stmt->execute(); 
        $stmt->store_result(); 
        return $stmt->num_rows > 0; 
    }

}
?>

1 个答案:

答案 0 :(得分:2)

虽然这不是您问题的直接答案,但我强烈建议您重写您的实施以使用password_hashpassword_verify。这些方法安全,非常非常容易使用。您甚至不需要指定自己的盐,因为让算法为您指定一个更安全!

你像这样使用它

<强>散列

$hash = password_hash($raw_user_password);

<强>验证

$is_correct_password = password_verify($raw_user_password, $hashed_password_from_db);

请注意,如果使用此方法,则无法以WHERE user_login = ? AND user_pass = ?格式运行SQL查询。您必须执行WHERE user_login = ?,获取结果,然后对password_verify的值运行user_pass方法。这比您当前的实施安全得多。