首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能在PHP中安全地存储密码吗?

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

Stack Overflow用户
提问于 2013-05-29 17:44:23
回答 4查看 4.5K关注 0票数 2

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

我将密码存储在一个数组中,如下所示

代码语言:javascript
复制
$filepassword[1] = "123"; // User Bob
$filepassword[2] = "321"; // User Tim

用户名以相同的方式存储在数组中,如下所示

代码语言:javascript
复制
$fileuser[1] = "Bob"; // Password 123
$fileuser[2] = "Tim"; // Password 321

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

但是,我是否应该将密码甚至是它们的散列存储在php文件中?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-29 17:49:04

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

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

PHP5.5已经推出了一个whole new set of password functions,那么你可以使用一个允许这些函数向前兼容的库吗?Password_compat

重点是,你包含这个文件,使用它的函数,然后当5.5发布时,你只需删除包含,所有的函数仍然有效,因为它们是核心的一部分。

它使用起来非常简单:

在database

  • When登录中,使用password_hash()

  • Store username
  • hash 验证在$_POST中发送的密码是否与数据库中的哈希一致。

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

你真的应该花点时间学习MySQL。但是,将代码编写为接口而不是具体实现,并随时将一种类型的存储切换为另一种类型的存储是很棒的。

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

您甚至可以serialize()您的数组并将其写入一个文件,然后在返回的过程中对其执行unserialize()操作。但我真的建议你花点时间来学习MySQL的基础知识,你很快就会学会的。

票数 12
EN

Stack Overflow用户

发布于 2013-05-29 17:48:45

嗯,是也不是。

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

但是1:如果黑客访问了服务器,你的密码不会被保存和泄露。2:犯了一个错误,php文件看起来不是php而是text,所以服务器将PHP输出为text,再次受到损害

因此,从某种意义上说,强烈建议对它们进行散列处理,至少是为了安全。

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

票数 2
EN

Stack Overflow用户

发布于 2013-05-29 18:01:00

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

passwords.php

代码语言:javascript
复制
<?php

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

login.php

代码语言:javascript
复制
<?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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16810573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档