Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
盐析和散列在php登录中不起作用_Php_Mysql_Hash_Salt - Fatal编程技术网

盐析和散列在php登录中不起作用

盐析和散列在php登录中不起作用,php,mysql,hash,salt,Php,Mysql,Hash,Salt,我正试图从O'Reilly(罗宾·尼克松)那里学习PHP,但那本书中编写的代码不起作用。我已经使用此代码将值添加到数据库中 $query = "CREATE TABLE users ( forename VARCHAR(32) NOT NULL, surname VARCHAR(32) NOT NULL, username VARCHAR(32) NOT NULL UNIQUE, password VARCHAR(32) NOT NULL)"; $resu

我正试图从O'Reilly(罗宾·尼克松)那里学习PHP,但那本书中编写的代码不起作用。我已经使用此代码将值添加到数据库中

    $query = "CREATE TABLE users (
    forename VARCHAR(32) NOT NULL,
    surname VARCHAR(32) NOT NULL,
    username VARCHAR(32) NOT NULL UNIQUE,
    password VARCHAR(32) NOT NULL)";
$result = $conn->query($query);
if (!$result) die($conn->error);*/

$salt1 = "qm&h*"; $salt2 = "pg!@";

$forename = 'Bill';
$surname = 'Smith';
$username = 'bsmith';
$password = 'mysecret';
$token = hash("ripemd128", "$salt1$password$salt2");

add_user($conn,$forename,$surname,$username,$token);

$forename = 'Pauline';
$surname = 'Jones';
$username = 'pjones';
$password = 'acrobat';
$token = hash('ripemd128', '$salt1$password$salt2');

add_user($conn,$forename,$surname,$username,$token);

function add_user($conn,$fn,$sn,$un,$pw) {
    $query = "INSERT INTO users VALUES('$fn','$sn','$un','$pw')";
    $result = $conn->query($query);
    if (!$result) die($conn->error);
}
然后当我尝试登录时,它给了我一个错误。为了更好地理解,我定制了错误语句,它给了我error1。我还尝试在数据库中存储密码而不使用哈希和salt,之后,当我尝试在不使用哈希和salt的情况下登录时,它工作得非常好,这证明问题在于哈希或salt,或者两者都有。根据这本书,我正在使用以下代码

    if (isset($_SERVER['PHP_AUTH_USER']) &&
    isset($_SERVER['PHP_AUTH_PW']))
{
    $un_temp = mysql_entities_fix_string($conn, $_SERVER['PHP_AUTH_USER']);
    $pw_temp = mysql_entities_fix_string($conn, $_SERVER['PHP_AUTH_PW']);

    $query = "SELECT * FROM users WHERE username='$un_temp'";
    $result = $conn->query($query);
    if (!$result) {
        die($conn->error);
    } elseif($result->num_rows) {
        $row = $result->fetch_array(MYSQLI_NUM);
        $result->close();
        $salt1 = "qm&h*"; $salt2 = "pg!@";
        $token = hash("ripemd128", "$salt1$pw_temp$salt2");

        if ($token == $row[3]) {
            echo "$row[0] $row[1] : Hi $row[0], you are now logged in as '$row[2]'";
        } else {
            die("error1 - Invalid username/password combination");
        }
    } else {
        die("error2 - Invalid 2 username/password combination");
    }
} else {
    header('WWW-Authenticate: Basic realm="Restricted Section"');
    header('HTTP/1.0 401 Unauthorized');
    die("Please enter your username and password");
}
$conn->close();

function mysql_entities_fix_string($conn, $string) {
    return htmlentities(mysql_fix_string($conn, $string));
}
function mysql_fix_string($conn, $string) {
    if (get_magic_quotes_gpc()) $string = stripslashes($string);
    return $conn->real_escape_string($string);
}
?>

我使用了一些代码,使用哈希和salt将密码存储在我的SQL中尝试使用它

$salt="pg!@";
$password="abcd";(for example)
$password_salt = $password.$salt;
$password_hash = hash('sha256', $password_salt);
u can use this password hash in your query for storing password.

Hope it helps

我使用了一些代码,使用哈希和salt将密码存储在我的SQL中尝试使用它

$salt="pg!@";
$password="abcd";(for example)
$password_salt = $password.$salt;
$password_hash = hash('sha256', $password_salt);
u can use this password hash in your query for storing password.

Hope it helps

1) 使用预先准备好的语句,2)不要自己进行哈希运算,使用。3) 不要修改用户密码以放入数据库或检索。@JonStirling我没有收到你的评论。我现在是初学者。请指定。请参阅上的示例,我已经链接到的密码API,您想查看密码\u散列和密码\u验证函数。@JonStirling好的,我会研究一下,但为什么上面的代码不起作用?根据这本书,它应该是有效的。我写的和书中写的一样,可能是因为单引号是文字字符串,变量没有插值。因此,当您拥有
“$salt1$password$salt2”
时,您可能打算拥有
“$salt1$password$salt2”
例如。1)使用准备好的语句,2)不要自己进行散列,请使用。3) 不要修改用户密码以放入数据库或检索。@JonStirling我没有收到你的评论。我现在是初学者。请指定。请参阅上的示例,我已经链接到的密码API,您想查看密码\u散列和密码\u验证函数。@JonStirling好的,我会研究一下,但为什么上面的代码不起作用?根据这本书,它应该是有效的。我写的和书中写的一样,可能是因为单引号是文字字符串,变量没有插值。因此,当您使用
'$salt1$password$salt2'
时,您可能打算使用
“$salt1$password$salt2”
例如。SHA-*家族的哈希算法不适合哈希密码,它们速度太快,而且很容易被强制执行。请改为切换到函数。SHA-*家族的哈希算法不适合哈希密码,它们速度太快,而且很容易被强制执行。请切换到该功能。