我创建了一个用户来使用我的数据库
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 不接受它?有没有办法做到这一点?
作为用户,您不知道密码是如何加密的(实际上根本没有加密,而是经过哈希处理)。
您只需传递密码,MySQL 就可以执行与原始密码相同的散列运算,并将其与存储的内容进行比较。如果传递散列版本,散列的全部好处就消失了:如果有人从服务器获取散列,他们就可以像使用普通密码一样使用这些来登录。散列然后成为密码。
额外的好处是 MySQL,因为它有原始密码,可以用更好的算法重新散列它,添加一点盐并存储改进的版本。如果它永远不会得到原件,那是做不到的。PHP 的密码函数也支持这一点。您可以检查password_needs_rehash
散列密码是否仍然正确散列,如果不是,则更新您的数据库。
因此,为了安全起见,您将需要采取其他措施。这些至少是:
root
. 给这个用户足够的权限来操作数据库,但不能更多。例如,没有删除表的权利。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句