Py学习  »  DATABASE

MySQL 8.0新的默认鉴权方式你做好准备了吗?

rowenan • 5 年前 • 392 次点击  


本文介绍了MySQL 8.0新的默认鉴权方式及配置方法。

上篇文章回顾:Etcd+confd通过Nginx对后端服务的注册发现

众所周知MySQL 8.0已于2018年4月19日GA,从Release Note中看到无论从新功能,诸如:隐藏索引、配置持久化、CTE(Common Table Expressions)、窗口函数、New 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';
为什么要修改默认鉴权方式

援引 NIST(National Institute of Standards and Technology),即美国国家标准和技术协会2015年8月给出的建议,不推荐使用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在用户已经登录过一次,被缓存的鉴权模型:

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

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

参考文章:

https://insidemysql.com/preparing-your-community-connector-for-mysql-8-part-1-sha256/

https://insidemysql.com/preparing-your-community-connector-for-mysql-8-part-2-sha256/

https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/

https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/LenW5LYg0m
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/24441
 
392 次点击