1

我试图了解password_hash()函数是如何工作的。

我用我选择的四个密码获得了这个超简化的 php 登录(完全不安全,只是为了学习而设计的)。

<?php

$data = file_get_contents('pass.txt');

if($_POST['pass']) {
    $line = explode("\n", $data);
    for($i = 0; $i<count($line); $i++) {
        $item = explode("#", $line[$i]);
        if($_POST['pass'] == $item[0]) {
            echo "Welcome! You're logged in!";
        }
    }
}

else { echo '<form method="POST" action="">
            <input type="password" name="pass">
            <input type="submit">
            <form>';
}

?>

还有这个pass.txt,密码保存的地方(.txt 平面文件数据库):

passone
passtwo
passthree
passfour

是否可以在我的代码中添加 password_hash() 函数?

我猜php应该能够为此目的重写数据库,因为这个函数每次登录时都会重写密码。

谢谢你们XXX

4

2 回答 2

1
  1. 为您echo password_hash('passone')的每个密码执行操作,将生成的长 gobbledygook 字符串存储在您的文本文件中。
  2. 而不是if ($_POST['pass'] == $item[0])
    你做if (password_verify($_POST['pass'], $item[0]))

也就是说,您使用password_verify文本文件中的明文密码和散列密码。password_hash在哈希过程中创建一个随机盐。这个随机盐是它返回的 gobbledygook 字符串的一部分!您需要在比较期间重复使用该随机盐。password_verify为你处理好。

这就是所有需要的。

于 2015-09-17T09:49:21.530 回答
1

是的。

哦,你应该使用 isset,否则你可能会得到 PHP 错误。你应该打破;找到正确的密码后,剩下的只是浪费cpu。

首先用于创建您的 pass.txt:

<?php
$passes=array(
'passone','passtwo','passthree'
);
foreach($passes as &$pass){
$pass=password_hash($pass,PASSWORD_DEFAULT);
}
file_put_contents("pass.txt",implode("\n",$passes));

然后喜欢

<?php

$data = file_get_contents('pass.txt');

if(array_key_exists('pass',$_POST)){
    $lines = explode("\n", $data);
    for($i = 0; $i<count($lines); $i++) {
        if(password_verify($_POST['pass'],$lines[$i])) {
            echo "Welcome! You're logged in!";
            break;
        }
    }
}

else { echo '<form method="POST" action="">
            <input type="password" name="pass">
            <input type="submit">
            <form>';
}
  • 警告的话。就我个人而言,我不喜欢 password_hash,因为它不容易与用其他语言编写的应用程序集成(在我的场景中是 c++),哈希结构没有明确定义(据我所知),缺少阅读 php 解释器的源代码代码..
于 2015-09-17T09:54:02.863 回答