为什么mysqli_connect()必须接收没有加密的密码参数?

时间:2017-10-23 20:12:26

标签: php mysql encryption mysqli connect

我创建了一个用户来使用我的数据库

CREATE USER 'my_user'@'localhost' IDENTIFIED BY 'my_pass';
GRANT ALL PRIVILEGES ON * . * TO 'my_user'@'localhost';
FLUSH PRIVILEGES;

传递以加密模式存储在 mysql.user 表中。

但是当我使用mysqli_connect()方法时,我发现当我将pass作为参数时,我必须给出我在查询中使用的非加密的原始值,如果我不想得到这个名字的话“连接失败:访问被拒绝用户'my_user'@'localhost'(使用密码:是)”。

但这实际上是存储在数据库中的字符串值(加密版本)。

怎么样?如果有人访问我建立连接的.PHP文件,那么将加密版本作为参数给出是不是更安全?为什么mysqli_connection不接受它?有办法吗?

1 个答案:

答案 0 :(得分:1)

您作为用户不知道密码是如何加密的(它实际上根本没有加密,而是加密)。

您只需传递密码,MySQL就可以执行与原始密码相同的散列,并将其与存储的密码进行比较。如果你传递散列版本,散列的全部好处都消失了:如果有人从服务器获取哈希值,他们就可以使用它们登录,就好像它们是普通密码一样。然后哈希成为密码。

增加的好处是MySQL,因为它有原始密码,可以用更好的算法重新散列它,添加一些盐并存储该改进版本。如果它永远不会得到原件,那就无法完成。 PHP's password functions也支持这一点。如果哈希密码仍然正确哈希,您可以查看password_needs_rehash,如果数据库不是,则可以更新数据库。

因此,为了安全起见,您需要采取其他措施。这些至少是:

  • 将密码存储在文档根目录之外的包含文件中。这样,没有人可以直接打开该文件。
  • 您可以阻止打开包含文件而不包含(例如,通过检查index.php中设置的定义)。这很好,但如果PHP由于配置错误而失败,人们可以只浏览文件的来源,所以坚持以前的规则。
  • 始终创建一个特殊的数据库用户。不要使用root。为此用户提供足够的权限来操作数据库,但不多了。例如,无权删除表。
  • 始终为该用户提供唯一的密码。您不必记住此密码。只需生成带有大量字符的随机垃圾。
  • 定期更改密码。也许你甚至可以编写脚本并将更新的密码存储在配置中。