MySQL 8.0新的默认身份验证和配置方法
MySQL 8.0于2018年4月19日发布。在发行说明中,您可以看到新功能例如:隐藏索引、持久化配置、CTE(公共表表达式)、窗口函数、新的 UTF8 和性能改进。 MySQL 8.0无疑带来了巨大的改进,大家应该跃跃欲试。不知道你是否也像我一样幸福呢?成功安装MySQL 8.0后,您尝试登录MySQL,却发现登录失败。
客户端和服务器的兼容性
如果您使用Navicat或其他桌面工具,您遇到的错误可能如下所示:
如果您使用的是原来旧版本的mysql命令如果您运行该工具,您遇到的错误可能如下所示:
error 2059: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
问题原因:
在 MySQL 8.0 GA 之后,默认身份验证方法从 mysql_native_password 更改为 caching_sha2_password。较低版本的 MySQL 客户端和驱动程序不支持此功能。一种身份验证方法。如果你习惯使用命令行工具访问数据库,升级官方客户端不是问题。不过,如果你使用的是第三方软件,就得碰碰运气才能及时赶上官方更新了。
解决方案:
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';
为什么要修改默认的身份验证方法参考2015年8月NIST(美国国家标准与技术研究所)建议,不建议使用SHA -1算法进行数字加密和建议使用更安全的SHA-2/3系列算法。 mysql_native_password使用SHA-1加密算法对密码进行两次加密。弱账户密码可以在几秒内被破解,带来更大的安全风险。 NIST推荐如下图:
MySQL 5.6正式版响应NIST推荐,支持sha256_password认证方式,但也付出了不小的计算成本。 MySQL 8.0之后默认的caching_sha2_password相比之前的sha256_password认证方式在性能和加密强度上有了质的飞跃。虽然同一个密码加密两次的密文存储方式不同,但由于使用了缓存机制,验证速度会比使用sha256_password方式快很多。
下图为第一个 sha256_password 或 caching_sha2_password 认证模型:
下图为用户登录一次后缓存的 caching_sha2_password 认证模型: 支持 对于新的 SidSol 客户端,客户端访问兼容性问题与服务器的合作仅仅是开始。如果您的公司也像我们一样开发了自己的数据库中间件产品,那么MySQL 8.0的新身份验证方法可以为登录过程带来全新的转变。如果你的公司恰好开发了自己的数据库中间件并且恰好使用官方的 JDBC 驱动程序,那么恭喜你。您只需升级 JDBC 驱动版本即可与 MySQL 8.0 更加兼容。但如果您不幸像我们一样使用自己的方法来封装网络通信协议,那么您在接下来的两周内将有大量工作要做。即使你自己设计和编写代码,你仍然必须自己填补漏洞。除了上面两个认证交互模型可以帮助我们了解代码改造的方向之外,最新的内部文档还根据各个网络交互包更新了字节码格式。下面三张图分别是客户端和服务器端采用不同认证方式时的第一次握手报文、握手响应报文和协商报文。 (虽然文档写得足够详细,但是情况总是比你想象的要复杂。除了文档之外,你还可以使用tcpdump和wireshark工具来改造你的代码。) 握手包如下:
支持以及非官方驱动的更新
与上面提到的中间件兼容性问题一样,非官方驱动往往是自行实现的MySQL网络通信功能。不幸的是,我们又被击中了。一些Go程序使用https://github.com/ziutek/mymysql来访问数据库。由于作者精力有限(参见:https://github.com/ziutek/mymysql/issues/140),短期内不会支持MySQL 8.0。与中间件升级思路类似,我们正在尝试修改mymysql以兼容MySQL 8.0。不过目前修改仍在内部测试中,MERGE尚未进入正式分支。有兴趣的朋友可以一起帮忙找bug。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。