Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
使用txt平面文件数据库向php添加密码\u hash()_Php_File_Text_Flat File_Php Password Hash - Fatal编程技术网

使用txt平面文件数据库向php添加密码\u hash()

使用txt平面文件数据库向php添加密码\u hash(),php,file,text,flat-file,php-password-hash,Php,File,Text,Flat File,Php Password Hash,我试图了解密码\u 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("#", $l

我试图了解
密码\u 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>';
}

?>
是否可以将密码\u hash()函数添加到我的代码中?

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

谢谢你们XXX

  • 执行
    echo password\u hash('passone')
    对于每个密码,将生成的长gobbledygook字符串存储在文本文件中
  • 而不是
    if($\u POST['pass']==$item[0])

    如果(密码验证($\u POST['pass'],$item[0]),则执行
    if
    也就是说,您在文本文件中使用明文密码和哈希密码<代码>密码\u散列在散列过程中创建一个随机salt此随机盐是它返回的gobbledygook字符串的一部分在比较过程中,您需要重复使用该随机盐
    password\u verify
    会为您解决这个问题

    这就是所需要的一切。

    是的

    哦,您应该使用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));
    

    你确切的怀疑是什么?如果您散列密码,您将存储诸如“$2y$10$.vga1o9wmrjrwavxd98hnogsnpdczlqm3jq7kned1rvagv3fykkkk1a”之类的内容,而不是“passone”。大概就这些了。是的,但不是应该更改每个登录名吗?php应该重写txt文件吗?我不知道该怎么写:'(使用可预测的salt,如用户名或其他内容。散列将保持一致,从而允许您进行比较。@DevDonkey否!否否。salt必须是随机的。
    password\u散列
    创建随机salt。不要颠覆这一点,它缺少salt的要点。您只需要使用
    password\u verify
    而不是
    =
    )>@deceze啊,我不知道有这样的魔法存在!酷:)谢谢,你似乎理解我,但每次你登录时存储的密码都会发生变化,在你的方法下,它不会这样做,因为它不会修改平面文件数据库。(我不知道我是否解释清楚)xxx查看我的更新。您只需将初始密码散列一次,然后使用
    password\u verify
    。您无需不断更改任何内容。有关基本机制的解释,请参阅。谢谢您的兴趣!您的回答非常好,但另一个最符合我的意图。也许我没有正确表达问题。我也对你的答案投了更高的票,因为我认为它可能也很有用。再次感谢xxxLooks非常好,但是,密码应该写在php文件中吗?(上面代码的第3行)从哪里获得密码取决于你..从文本文件、数据库中获取密码。在这里,我只是在php文件中硬编码,是的。继续,使用$passs=file(“unencrypted_passwords.txt”,file_IGNORE_NEW_line)^^我正在尝试你的代码。很好。创建密码的代码中的所有内容都正确吗?它在数据库中写入未加密的密码。它不应该写入哈希代码并不断重写它们吗?哎呀,我在代码中发现了一个拼写错误,“foreach($passess as&$pass)”应该是“foreach($passes as&$pass)”…但是密码应该在数据库中加密/散列,是的..我自己也试过了代码,所有的东西都是在pass.txt中散列的,没有明文密码..我给你打勾,这是一个非常好的解决方案。无论如何,应该有一种方法来消除php中的明文密码,一旦它们在数据库中出现。不是吗?
    <?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>';
    }