Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >两个密码验证插件的故事……

两个密码验证插件的故事……

作者头像
MySQLSE
发布于 2020-09-28 07:56:39
发布于 2020-09-28 07:56:39
1.2K0
举报

作者:Harin Vadodaria 译: 徐轶韬

很久以前(在遥远的星系中……提示音乐!),MySQL增加了对身份验证插件的支持,这个插件现在称为mysql_native_password。mysql_native_password插件使用SHA1哈希

  • 将密码(SHA1(SHA1(password)))存储在mysql.user表中
  • 验证用户

该插件的一个优点是,它允许使用质询-响应机制进行身份验证,可以在未加密的通道上验证客户端的身份,而无需发送实际密码。

随着时间的流逝,我们从身份验证方案的角度发现了需要改进的几个方面。

  1. 将值存储在数据库中时,密码的转换必须使用盐值(增加的因素)。没有它,两个具有相同密码的帐户将具有相同的哈希值。尽管不能显示实际的密码,但它提供了用户正在使用的密码的线索,这样会减少暴力攻击和获取密码所需的工作。
  2. 防止使用暴力攻击破解存储的密码。最好在存储密码时使用许多(数千)轮哈希。
  3. 使用更强大的哈希机制。随着技术的发展,SHA1和其他哈希算法的前身(例如MD5)已被证明非常容易破解。注意:NIST 在2011年已弃用。因此,如果您可以从mysql.user表中获取哈希值,或者通过截取未加密的通道,则可以对这些密码进行快速反向工程和破解,尤其是当密码较短(少于8个字符)时。关于这部分内容可以参阅FIPS 180-4。
  4. 对身份验证阶段和密码使用不同的哈希方案。在这两种情况下,mysql_native_password插件使用的都是类似的转换(SHA1(SHA1(password)))。

为了克服这些限制,从MySQL-8.0.3开始, 引入了一个新的身份验证插件 caching_sha2_password。从 MySQL-8.0.4开始,此插件成为MySQL服务器的默认身份验证插件。通过caching_sha2_password身份验证,我们可以解决上述问题,同时确保不影响性能。使用MySQL的应用程序可以以很高的频率连接和断开连接。

MySQL caching_sha2_password的设计重点是:

  • 使用SHA-2哈希机制来转换密码。具体来说,它使用SHA256。
  • 生成哈希时,每个密码使用20字节长的盐值。由于盐值是随机数,即使两个用户使用相同的密码,转换过程的最终结果也将完全不同。
  • 为了让暴力破解更难以尝试和猜测密码,在将最终转换存储在mysql.user表中之前,对密码和盐值进行了5000轮SHA2哈希。
  • 两种操作方式:
    • COMPLETE:要求客户端安全地发送实际密码(通过TLS连接或使用RSA密钥对)。服务器生成5000轮哈希,并与mysql.user中存储的值进行比较。
    • FAST:允许使用SHA2哈希的进行基于质询-响应的身份验证。同时实现高性能和安全性。
  • DBA可以强制数据库客户端定期使用COMPLETE模式来确定实际密码的信息。这个过程消耗非常大。
  • 通过使用不同轮回数的哈希将密码存储和身份验证脱钩。即使有人可以访问这两个密码,也无法在实际可行的时间内使用此信息来推断密码或获取密码的sha2哈希。

蛮力破解8字符长的密码以及5000轮盐化的哈希值将花费很长时间。比任何密码过期策略都要长——即使是最宽松的策略。更长的密码只会让事情变得更困难。

下表比较了mysql_native_password和caching_sha2_password。

请参考 https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/ 有关caching_sha2_password插件的博客文章。您也可以参考文档https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html以获取更多详细信息。页面https://dev.mysql.com/doc/dev/mysql-server/latest/page_caching_sha2_authentication_exchanges.html提供了有关如何使用caching_sha2_password插件执行身份验证的详细信息。

除了新插件外,还添加了一些功能来防止尝试识别用户信息并减轻弱密码相关的风险:

  • 支持TLS连接,无需任何额外的工作(服务器端支持和客户端端支持)以确保默认情况下连接是安全的
  • CREATE USER / ALTER USER提供了几个选项https://dev.mysql.com/doc/refman/8.0/en/create-user.html#create-user-password-management来指定密码管理策略
  • 控制密码的内容–长度,字符复杂度等。
  • 减缓暴力破解,猜测密码会增加延迟以及设置最大尝试限制
  • 使用随机一次密码重置密码。
  • 防止用户枚举的其他措施

这些功能与caching_sha2_password结合使用,可增强用户帐户抵御密码攻击的能力。请根据您的要求使用它们,并让我们知道您的反馈。

另外,mysql系统模式的数据可以在静态时进行加密(InnoDB加密, 二进制日志加密)。

这样可以保护敏感数据,例如密码哈希,以防止未经授权的文件访问。这对OS /文件系统中隐藏了许多细节。参考信息– DBA(具有所需权限集的用户,例如mysql.user表上的SELECT权限)可以看到此哈希数据,而与使用静态数据加密方案无关。也就是说,即使是在这种情况下,对密码进行反向工程的成本仍然很高

如果仅凭安全性不足以促使您升级到caching_sha2_password,那么另一项商业动机就是遵守法规。大多数法规禁止将sha1,md5和其他弱密码用于密码或其他用途。(HIPAA,GDPR等)

总结一下:

  • 如果您使用的是mysql_native_password,请尽快计划迁移到caching_sha2_password或支持与外部身份验证服务器集成的 企业身份验证插件之一。SHA1不够安全,切换也不困难。
  • 对mysql.user表的访问应尽可能严格。即使它不存储实际的密码,该表中的信息也非常敏感-尤其是密码哈希。实际上,无论您在何处存储此类哈希-无论是在MySQL数据库中还是在外部身份验证服务器(例如LDAP服务器)上,都必须始终对其进行保护。 OpenLDAP文档 很好地阐明了这一点:
  • 使用MySQL提供的密码策略功能来控制密码生命周期。
  • 使用MySQL提供的控件来防止对密码的暴力攻击。
  • 在mysql模式上,最好在所有表上使用InnoDB加密,以及二进制日志加密,以保护静态数据免受未经授权的访问。
  • 始终使用加密的连接:在HA拓扑中,无论是服务器-客户端通信还是服务器-服务器通信。仅加密静态数据是不够的。数据在传输过程中必须受到保护。
  • 始终通过加密备份来保护备份,以避免数据泄漏

与往常一样,非常感谢您使用MySQL!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL解决方案工程师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[MYSQL] 记录mysql密码 (临时修改密码, 然后改回原来的密码)
有这么一个需求: 我们要临时修改mysql部分账号的密码. 等过一段时间就修改回来.
大大刺猬
2024/07/18
3120
[MYSQL] 记录mysql密码 (临时修改密码, 然后改回原来的密码)
浅谈 MySQL 新的身份验证插件 caching_sha2_password
从 MySQL 8.0.4 开始,MySQL 默认身份验证插件从 mysql_native_password 改为 caching_sha2_password 。相应地,libmysqlclient 也使用 caching_sha2_password 作为默认的身份验证机制。
老叶茶馆
2023/02/18
3.1K0
浅谈 MySQL 新的身份验证插件 caching_sha2_password
MySQL 如何实现安全连接?
在搭建某些环境的时候,常常会遇到需要输入 SSL/TLS 相关文件的情况,例如:ssl-ca、ssl-cert、ssl-key 等,在不了解其内在逻辑的情况下,会对这些参数比较陌生。
爱可生开源社区
2025/04/11
1950
MySQL 如何实现安全连接?
Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ 完美解决方法
遇到 Error 1045 (28000): Access denied for user ‘root’@‘localhost’ 错误是新手在配置 MySQL 时的常见问题。这通常意味着 root 用户无法通过提供的密码访问 MySQL 服务器。本篇文章将详细介绍导致这一问题的原因,并提供多种解决方案,帮助你彻底解决此问题。最后还有我的微信供大家交流。
默 语
2024/12/28
4.1K0
Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ 完美解决方法
Mysql8.0默认加密连接方式修改
Mysql8.0默认采用了新的caching_sha2_password的身份验证方式,此方式并不兼容常规的老的web服务接口,当然,不排除后面会出现。比如phpmyadmin5.0测试版已经出现兼容caching_sha2_password的模式。
Zach
2019/12/30
13.1K2
MySQL8.0新特性之默认使用caching_sha2_password作为身份验证插件
MySQL5.8从开始将caching_sha2_password作为默认的身份验证插件
星哥玩云
2022/08/17
2.7K0
docker部署mysql 实现远程连接[通俗易懂]
2.docker pull mysql 要选择starts最高的那个name 进行下载
全栈程序员站长
2022/07/28
2.6K0
docker部署mysql 实现远程连接[通俗易懂]
MySQL 8.0 安装部署3个注意事项
墨墨导读:本文分享实际案例中MySQL8.0安装部署时最典型的3个问题,希望对大家有帮助。
数据和云
2020/08/04
1.5K0
MySQL 8.0 安装部署3个注意事项
Mysql8.0赋予用户对数据库的全部权限相较于Mysql5.7的改动
主要原因: 在 MySQL 8.0 中,caching_sha2_password 是默认的身份验证插件而不是之前版本的 mysql_native_password,默认的密码加密方式由之前的 SHA1 改为了 SHA2。
诡途
2022/05/09
8450
MySQL 8.0 版本功能变更介绍
作者介绍:朱强,腾讯云数据库高级工程师,主要负责腾讯云数据库MySQL的开发和运营,曾就职于华为和网宿,在存储、文件系统开发有丰富经验。
腾讯云数据库 TencentDB
2018/07/13
4.1K1
技术分享 | MySQL:caching_sha2_password 快速问答
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
爱可生开源社区
2022/06/21
2.8K0
【数据库】已解决:MySQL8报错:Public Key Retrieval is not allowed
在连接MySQL数据库时,遇到如下报错信息:“Public Key Retrieval is not allowed”。
屿小夏
2025/05/23
3140
技术分享 | 快速掌握 MySQL 8.0 认证插件的使用
MySQL 8.0.15 版本主从复制时,io 线程一直处于 connecting 状态, 由于复制用户使用的认证插件是 caching_sha2_password,而想要通过 caching_sha2_password 认证的用户访问数据库,只有两个途径:
爱可生开源社区
2020/03/13
9790
MySQL 9.0 GA 来了!
2024 年 7 月 2 日,MySQL 9.0 GA 版本正式发布。还记得 MySQL 8.0 版本正式发布于 2018 年 4 月 19 日,中间经过了 6 年之久,MySQL 官方终于发布了大版本号变更得 9.0 版本,接下来由我给大家介绍 MySQL 在 9.0 版本中有哪些新的变化。 本文包含如下内容:
wayn
2024/07/04
1K0
MySQL 9.0 GA 来了!
MGR新节点RECOVERING状态的分析与解决:caching_sha2_password验证插件的影响
在GreatSQL社区上有一位用户提出了“手工构建MGR碰到的次节点一直处于recovering状态”,经过排查后,发现了是因为新密码验证插件caching_sha2_password导致的从节点一直无法连接主节点,帖子地址:➥https://greatsql.cn/thread-420-2-1.html
GreatSQL社区
2023/09/20
3530
MGR新节点RECOVERING状态的分析与解决:caching_sha2_password验证插件的影响
MYSQL caching_sha2_password 加密原理和连接过程(FULL)
本文主要讲caching_sha2_password的加密原理和连接过程(比mysql_native_password复杂一些)
大大刺猬
2023/03/28
3K0
MYSQL caching_sha2_password 加密原理和连接过程(FULL)
MySQL使用多因素身份认证
多因素身份验证(MFA)是指用户在身份验证过程中使用多个身份验证值(或“因素”)。MFA比单因素/单因素身份验证(1FA/SFA)提供了更高的安全性,后者只使用一种身份验证方法(如密码)。MFA支持其他身份验证方法,例如使用多个密码进行身份验证,或者使用智能卡、安全密钥和生物识别阅读器等设备进行身份验证。
MySQLSE
2023/02/10
1.5K0
MySQL使用多因素身份认证
ERROR 1396 (HY000): Operation ALTER USER failed for ‘root’@’localhost’「建议收藏」
注:原因为MySql 8.0.11 换了新的身份验证插件(caching_sha2_password), 原来的身份验证插件为(mysql_native_password)。而客户端工具Navicat Premium12 中找不到新的身份验证插件(caching_sha2_password),对此,我们将mysql用户使用的 登录密码加密规则 还原成 mysql_native_password,即可登陆成功。
全栈程序员站长
2022/09/22
5.7K0
ERROR 1396 (HY000): Operation ALTER USER failed for ‘root’@’localhost’「建议收藏」
新特性解读 | MySQL 8.0 多因素身份认证
MySQL 8.0.27 增加了多因素身份认证(MFA)功能,可以为一个用户指定多重的身份校验。为此还引入了新的系统变量 authentication_policy ,用于管理多因素身份认证功能。
爱可生开源社区
2022/04/06
1.7K0
MySQL8.0提示 caching_sha2_passwor' cannot be loaded
今天在测试使用sqlyog或者navicat 去 连接MySQL8.0 的时候,出现如下报错提示:
保持热爱奔赴山海
2019/09/17
7410
推荐阅读
相关推荐
[MYSQL] 记录mysql密码 (临时修改密码, 然后改回原来的密码)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档