你能安全地在PHP中存储密码吗?


Can you safely store passwords in PHP?

本问题已经有最佳答案,请猛点这里访问。

我最近做了一个php登录脚本,其中有一个用户名和密码登录,用于会话测试,没有mysql。

我把密码存储在这样的数组中

1
2
$filepassword[1] ="123"; // User Bob
$filepassword[2] ="321"; // User Tim

用户名以同样的方式存储在类似这样的数组中

1
2
$fileuser[1] ="Bob"; // Password 123
$fileuser[2] ="Tim"; // Password 321

我使用post获取输入的edd密码,然后将其放入for循环,如果密码在数组中等于1,则它将中断并返回1,然后检查数字是否与用户名匹配,并检查是否匹配。

但是,应该在PHP文件中保留密码,甚至是密码的散列值吗?


为什么要使用PHP文件来存储用户名和密码?使用数据库进行用户名/密码检索是相当标准的(现在也很简单)。

也就是说,您不希望将密码以纯文本形式存储在数据库中。

php 5.5有了一套全新的密码函数,那么您如何使用一个允许这些函数向前兼容的库呢?密码兼容。

要点是,您包含文件,使用它的函数,然后当5.5出现时,您只需删除include,所有函数仍然可以工作,因为它们是核心的一部分。

使用起来非常简单:

  • 使用password_hash()散列密码
  • 将用户名和哈希存储在数据库中
  • 登录时,使用password_verify()根据数据库中的散列验证以$u post发送的密码。

就是这样!简单,安全,向前兼容。强烈推荐使用平面文件存储。

你真的应该花点时间学习MySQL。但是,编写一个接口的代码而不是具体的实现,并在任何时候根据需要将一种类型的存储切换到另一种类型是非常好的。

也就是说,散列你的密码和用户名,如果必须的话,把它们写到一个文件中。至少它们将被散列,而不是纯文本。您仍然可以使用上面描述的函数。

您甚至可以将数组中的serialize()写入一个文件,然后在返回的路上将它写到unserialize()中。但是我真的建议你花点时间来学习MySQL的基础知识,你很快就会学会的。


是的,也不是。

PHP是一种服务器端语言,因此通过客户机没有人能看到密码。

但是1:如果黑客访问服务器,您的密码不会被保存和泄露。2:出错了,php文件不是php而是文本,所以服务器将php输出为文本,再次受到影响。

因此,在某种意义上,强烈建议至少散列它们以确保安全。

然后是将其保存到PHP文件中的问题。它有一些问题。1:使用起来不容易,有了数据库,你可以进行很好的搜索等。2:在PHP中加载一个(及时的)大型数组,只需要1个值。记忆的浪费


对于少量密码,将它们存储在文件中是完全可行的。你应该选择一个健全的数组格式,你的格式是…相当不理想。而且,正如前面所说,永远不要以纯文本形式存储密码。

密码

1
2
3
4
5
6
<?php

return array(
    'Bob' => '$2y$10$lwnevwevweuvuev...',  // hash of Bob's password
    ...
);

Login

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

// include https://github.com/ircmaxell/password_compat functions
require_once 'lib/password.php';

$passwords = require 'passwords.php';

if (isset($_POST['username'], $_POST['password'])) {
    if (!isset($passwords[$_POST['username']])) {
        die('Invalid username');
    }
    if (!password_verify($_POST['password'], $passwords[$_POST['username']])) {
        die('Invalid password');
    }
    echo 'Hi there!';
}

只要使用一个健壮的算法正确地散列密码,将它们存储在一个文件中就不会比使用数据库更不安全。有一点需要注意的是,千万不要意外地泄露该PHP文件的内容;放错位置的var_debug($passwords)或配置错误的Web服务器可能会使密码散列公开。在这种情况下,它们仍然是散列的,但最好还是保密。使用一个经过验证且用户友好的哈希库,如https://github.com/ircmaxell/password_compat。


我认为最安全的选择是使用md5()函数。$fileuser[1]=md5($fileuser[1]);等。。。

将所有内容转换为MD5,然后可以将转换后的字符串相互比较以获得相等或不高质量。

希望我能帮上忙。