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

时间:2013-05-29 09:44:23

标签: php

我最近制作了一个带有用户名和密码登录名的PHP登录脚本,用于测试会话而没有MySQL。

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

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

用户名以相同的方式存储在数组中

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

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

但是,我应该在php文件中存储密码甚至哈希吗?

4 个答案:

答案 0 :(得分:10)

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

话虽这么说,你想要以纯文本形式存储数据库中的密码。

PHP 5.5有一个whole new set of password functions即将推出,那么你如何使用一个允许这些功能向前兼容的库呢? Password_compat

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

使用起来非常简单:

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

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


你真的应该花时间学习MySQL。但是,对接口而不是具体实现进行编码是很棒的,并且可以随时将一种类型的存储转换为另一种类型。

话虽如此,请将您的密码和用户名哈希,如果必须,请将它们写入文件。至少他们会被散列,而不是纯文本。您仍然可以使用上述功能。

你甚至可以serialize()你的数组并将其写入文件,然后在回来的路上unserialize()。但我真的建议你抽出时间学习MySQL的基础知识,你马上就可以把它拿起来。

答案 1 :(得分:2)

是的,没有。

PHP是服务器端语言,所以通过客户端没有人能看到密码。

BUT 1:如果黑客可以访问服务器,则密码不会被保存和泄露。 2:出现错误并且php文件看不到php而是文本,因此服务器将PHP作为文本输出,再次受到损害

所以在意义上强烈建议至少哈希它们以保证安全。

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

答案 2 :(得分:0)

对于少量密码,将它们存储在文件中是完全可行的。你应该只选择 sane 数组格式,你的......非常不理想。此外,如上所述,永远不要以明文存储密码。

passwords.php

<?php

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

的login.php

<?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

答案 3 :(得分:-5)

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

将所有内容转换为md5然后您可以将转换后的字符串相互比较以获得相等或不等。

希望我有所帮助。