从 MySQL 8.0.4 开始,默认身份验证插件从 mysql_native_password 更改为 caching_sha2_password。相应地,现在的 libmysqlclient 将使用 caching_sha2_password 作为默认的验证机制。
为什么这样做呢?
MySQL 5.6/5.7 的默认密码插件一直以来都是 mysql_native_password。其优点是它支持 challenge-response 机制,这是非常快的验证机制,无需在网络中发送实际密码,并且不需要加密的连接。然而,mysql_native_password 依赖于 SHA1 算法,但 NIST(美国国家标准与技术研究院)已建议停止使用 SHA1 算法,因为 SHA1 和其他哈希算法(例如 MD5)已被证明非常容易破解。
此外,由于 mysql_native_password 在 mysql.user 表中 authentication_string 字段存储的是两次哈希 SHA1(SHA1(password)) 计算的值 ,也就是说如果两个用户帐户使用相同的密码,那么经过 mysql_native_password 转换后在 mysql.user 表得到的哈希值相同。尽管有 hash 值也无法得到实际密码信息,但它仍然告诉这两个用户使用了相同的密码。为了避免这种情况,应该给密码加盐(salt),salt 基本上是被用作输入,用于转换用户密码的加密散列函数。由于 salt 是随机的,即使两个用户使用相同的密码,转换后的最终结果将发生较大的变化。
从 MySQL 5.6 开始支持 sha256_password 认证插件。它使用一个加盐密码(salted password)进行多轮 SHA256 哈希(数千轮哈希,暴力破解更难),以确保哈希值转换更安全。然而,它需要要么在安全连接或密码使用 RSA 秘钥对加密。所以,虽然密码的安全性更强,但安全连接和多轮 hash 转换需要在认证过程中的时间更长。
为了克服这些限制,从 MySQL 8.0.3 开始,引入了一个新的身份验证插件 caching_sha2_password。从 MySQL 8.0.4 开始,此插件成为 MySQL 服务器的新默认身份验证插件。caching_sha2_password 尝试一个两全其美的结合,既解决安全性问题又解决性能问题。
首先,是 caching_sha2_password 对用户密码的处理,其实主要是 sha256_password 的机制:
- 使用 SHA2 算法来转换密码。具体来说,它使用 SHA256 算法。
- 保存在 authentication_string 列中的哈希值为加盐后的值,由于盐是一个 20-byte 的随机数,即使两个用户使用相同的密码,转换后的最终结果也将完全不同。
- 为了使使用暴力破解机制更难以猜测密码,在将最终转换存储在 mysql.user 表中之前,对密码和盐进行了 5000 轮 SHA2 散列。
为了实现加盐机制,列 authentication_string 需保存保存盐值,因此 authentication_string 值的长度变为了 70 个字节:
mysql> select user, host, authentication_string, length(authentication_string), plugin from mysql.user limit 1;
+------+------+------------------------------------------------------------------------+-------------------------------+-----------------------+
| user | host | authentication_string | length(authentication_string) | plugin |
+------+------+------------------------------------------------------------------------+-------------------------------+-----------------------+
| root | % | $A$005$1%h5f1OdZ0'46}M[uz5Di5wW2WWg8eeLWynsg2h3xnzHwQLmm39bEqLBxB0 | 70 | caching_sha2_password |
+------+------+------------------------------------------------------------------------+-------------------------------+-----------------------+
1 row in set (0.00 sec)
新 caching_sha2_password 认证机制下,authentication_string 中的字节,例如上面的字符串$A$005$1%h5f1OdZ0'46}M[uz5Di5wW2WWg8eeLWynsg2h3xnzHwQLmm39bEqLBxB0,其中分别保存如下内容:

本文解析了MySQL 8.0.4后默认身份验证插件从mysql_native_password转向caching_sha2_password的原因,涉及SHA1算法弃用、安全性提升和性能优化。caching_sha2_password结合了SHA256加密与内存缓存,兼顾安全与速度,并介绍了RSA加密在不安全连接中的应用。
最低0.47元/天 解锁文章
608

被折叠的 条评论
为什么被折叠?



