8

我想在 PHP 中构建一个简单的单用户登录“库”,但我面临以下困境:如果我不使用数据库,我应该如何存储用户名和密码?

一个简单的纯文本文件可以很容易地读取,然后密码可以很容易地被解密,所以这不是一个选项。

如果我只创建一个 php 文件

<?php
    $Username= "username";
    $Password= "password";
?>

那么没有人应该能够阅读它,我可以简单地将这个文件包含在我需要的地方,但我不确定你是否找不到更好的方法来做到这一点!

那么,在您看来,这个问题的最佳解决方案是什么(以及为什么)?

谢谢

4

9 回答 9

3

您可以将其存储在文件中并使用 SHA1/SHA2 哈希,这样就无法解密。

user:<sha1hash>
user:<sha1hash>
...
于 2010-05-06T17:28:34.207 回答
3

纯文本文件一个选项,它是这里最简单的解决方案。只需散列密码(使用salt)。它不能可靠地解密。

您可以为此使用 PHPmd5sha1哈希函数。

于 2010-05-06T17:29:06.110 回答
2

如果您需要多个帐户,纯文本文件会比使用 PHP 源文件更容易。我认为您担心人们通过浏览器请求文件?

检查您的网络主机是否有某种不可公开访问的目录,例如实际网络内容所在的父目录。PHP 通常可以在那里读写,但不能通过网络访问。

如果没有您有权访问的目录,文件权限和/或.htaccess 文件(Apache) 可能会对您有所帮助。

我建议您使用crypt函数来存储密码(哈希),而不是存储普通密码。这是与您存储它们的位置不同的问题:)

于 2010-05-06T17:33:19.507 回答
1
  • 您可以使用带有散列加密函数的纯文本文件。如果您有很多用户,它是可靠的,但不是很灵活。

  • 您还可以使用SQLite,它是一个数据库,但不是服务器,它存储在一个简单的文件中。如果您不能安装 SQL 服务器但又想存储大量用户并具有更大的灵活性,这是一个不错的折衷方案。

  • 根据您想要做什么,.htaccess可能是一个很好的解决方案。它已经是安全的,但作为纯文本解决方案,它并不灵活。但它几乎内置了所有 Apache 配置。

于 2010-05-06T17:32:33.850 回答
1

(这开始是对 Daniel DiPaolo 的评论,以回应 Mokuchan。)

如果要存储密码(无论位置如何),请使用以下方案:

$hashedPassword = $salt 。哈希($盐。$密码);

哈希密码的存储位置应该是安全的。无论是在数据库中还是在具有适当权限集的文件中。

如果是一个文件,那么您的用户bob的“记录”和密码将如下所示(使用 BCrypt 哈希)

bob:$2a$05$tlk4M8WSpVkO7ER6QGxcwuY91MrBCQn.TCDZ5eOM1iz2sCChtR62K

任何人都无法“解密”密码。这就是使用散列算法的重点:它是不可逆的。

您声明:

有一些工具会尝试解密 md5 和 sha1,至少在某些情况下它们似乎可以工作

由于散列算法是不可逆的,因此这是不可能的。(没有“解密”选项)

我最好的猜测是,您指的是从预先计算的表中查找哈希并返回有效输入字符串的工具,可能是您的密码。
这些表称为彩虹表。它们可以被 A) 使用随机盐和 B) 使用强哈希算法(例如 BCrypt 哈希或 SHA2 系列哈希)击败

关于不正确的散列算法:MD5 和 SHA1 被认为是密码损坏的。换句话说:你不应该再使用它们了。

有关此问题的讨论,请参阅:https ://stackoverflow.com/questions/2768248/is-md5-really-that-bad

于 2010-05-06T18:42:11.643 回答
1

如果只有一个用户,那么拥有用户名的目的是什么?

还不如只使用 .htaccess 管理权限...

于 2010-05-06T17:35:12.910 回答
0

那些说你可以加密密码的人也是如此。

另外,不要将文件放在文档树中。将文件放在其他地方。您的 PHP 程序应该仍然能够通过指定绝对路径或“..”的相对路径来读取它,但是要处理层次结构的多个级别,然后到达文件所在的位置。(在 Java 应用程序中,有一个 WEB-INF 目录可以方便地存储这类东西。我认为 PHP 中没有类似的东西——我已经有一段时间没有做任何 PHPing 了——但你可以始终只是将文件完全放在应用程序的目录层次结构之外。)

于 2010-05-06T19:43:51.943 回答
0

最好的方法是

$password_hash = hash("sha256", "iamawesome"); // 4aa4029d0d0265c566c934de4f5e0a36496c59c54b6df8a72d9c52bdf0c1a0e8

$user_entered = hash("sha256", $_POST['password']); 返回($user_entered == $password_from_db);

hashin 将保护您的密码..

详细文章:http ://wblinks.com/notes/storing-passwords-the-wrong-better-and-even-better-way

于 2012-10-19T05:48:53.737 回答
0

不要重新发明轮子,使用这个http://pear.php.net/manual/en/package.fileformats.file-passwd.file-passwd-unix.php

于 2010-05-06T20:45:39.617 回答