MySQL 8.0新的默认鉴权方式及配置方法

2018-10-0208:22:09数据库教程Comments6,786 views字数 1899阅读模式

MySQL 8.0已于2018年4月19日GA,从Release Note中看到无论从新功能,诸如:隐藏索引、配置持久化、CTE(Common Table Expressions)、窗口函数、New UTF8,还是性能上的提升MySQL 8.0无疑都作出了重大的改善,大家应该都有跃跃欲试的冲动了吧。不知道你是否和我一样兴高采烈的安装成功MySQL 8.0之后,尝试登录MySQL却发现居然登录失败。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

MySQL 8.0新的默认鉴权方式及配置方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

客户端与服务端的兼容

如果你用的是Navicat或是其他的桌面工具,你遇到的报错可能长下面这个样子:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

MySQL 8.0新的默认鉴权方式及配置方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

如果你使用的是原来老版本的mysql命令行工具,那么你遇到的报错可能长下面这个样子:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

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客户端和驱动并不支持这一鉴权方式。如果你习惯用命令行工具访问数据库升级一下官方的客户端并不麻烦,但如果你使用的是第三方的软件,能否及时与官方保持同步更新就要碰碰运气了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

解决办法:

ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';
为什么要修改默认鉴权方式

援引 NIST(National Institute of Standards and Technology),即美国国家标准和技术协会2015年8月给出的建议,不推荐使用SHA-1算法进行数字加密,推荐使用更安全的SHA-2/3系列算法。而mysql_native_password正是使用两次SHA-1加密算法对密码进行加密的,较弱的账号密码几秒钟就能够被爆破,存在较大的安全风险。NIST建议如下图:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

MySQL 8.0新的默认鉴权方式及配置方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

官方在MySQL 5.6版本已经响应NIST的建议,支持了sha256_password鉴权方式,但为此也付出了不小的计算代价。MySQL 8.0之后默认的caching_sha2_password较之前的sha256_password鉴权方式在性能和加密强度上又有了质的飞跃,即使是同一个密码两次加密出来的密文在存储上也都是不相同的,而且由于使用了缓存机制,较sha256_password方式鉴权速度也会提升很多。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

下图为sha256_password或caching_sha2_password首次鉴权模型:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

MySQL 8.0新的默认鉴权方式及配置方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

下图为caching_sha2_password在用户已经登录过一次,被缓存的鉴权模型:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

MySQL 8.0新的默认鉴权方式及配置方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

中间件对新的客户端驱动的支持

客户端访问服务端的兼容性问题的解决只是一个开始,如果你所在的公司像我们一样也自研了数据库中间件产品,MySQL 8.0新的鉴权方式带来的可能是全新的登录流程改造。如果刚好你所在的公司也自研了数据库中间件,刚好使用的是JDBC官方驱动那么要恭喜你了,只需要升级JDBC驱动版本就能比较好的兼容MySQL 8.0,但如果很不幸你像我们一样使用的是自己封装网络通信协议的方式的话,接下来两周就要有的忙了。自己做的设计,自己写的代码,坑还是得自己填。除了上面两张鉴权交互模型能够帮助我们把握代码改造方向外,基于每次网络交互包的字节码格式在最新的Internal文档中也有更新。下面三张图分别是首次握手包,握手响应回文包,以及客户端与服务端使用鉴权方式不一致时的协商包。(虽然文档已经写的足够详细了,但情况永远比想像的复杂,除了文档之外,用好tcpdump和wireshark工具会能让你代码改造轻松一些。)握手包如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

MySQL 8.0新的默认鉴权方式及配置方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

MySQL 8.0新的默认鉴权方式及配置方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

MySQL 8.0新的默认鉴权方式及配置方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

非官方驱动的支持与升级

与上面讲到的中间件的兼容性问题一样,非官方的驱动往往也是自己实现的MySQL底层网络通信函数。很不幸的是我们又一次中枪了,有些Go程序使用了https://github.com/ziutek/mymysql 来访问数据库,由于作者精力有限(参见:https://github.com/ziutek/mymysql/issues/140),短时间内暂时不会对MySQL 8.0做支持。与中间件升级的思路类似,我们尝试对mymysql进行修改,以求兼容MySQL 8.0。不过当前的修改还在内测中,尚未MERGE进官方分支,有兴趣的朋友可以帮忙一起找找BUG。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/6124.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/6124.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定