我创建了一个用户来使用我的数据库
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不接受它?有办法吗?
答案 0 :(得分:1)
您作为用户不知道密码是如何加密的(它实际上根本没有加密,而是加密)。
您只需传递密码,MySQL就可以执行与原始密码相同的散列,并将其与存储的密码进行比较。如果你传递散列版本,散列的全部好处都消失了:如果有人从服务器获取哈希值,他们就可以使用它们登录,就好像它们是普通密码一样。然后哈希成为密码。
增加的好处是MySQL,因为它有原始密码,可以用更好的算法重新散列它,添加一些盐并存储该改进版本。如果它永远不会得到原件,那就无法完成。 PHP's password functions也支持这一点。如果哈希密码仍然正确哈希,您可以查看password_needs_rehash
,如果数据库不是,则可以更新数据库。
因此,为了安全起见,您需要采取其他措施。这些至少是:
root
。为此用户提供足够的权限来操作数据库,但不多了。例如,无权删除表。