MySQL添加了对身份验证插件的支持,该插件现在称为mysql_native_password。该mysql_native_password插件使用SHA1哈希

将密码(SHA1(SHA1(password)))存储在mysql.user表中
验证用户,该插件的一个优点是,它允许使用质询-响应机制进行身份验证,从而可以在未加密的通道上验证客户端的身份,而无需发送实际密码。

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

  • 在将值存储在数据库中时,密码的转换必须使用盐(增加的因素)。没有它,两个具有相同密码的帐户将具有相同的哈希值。尽管这并不能显示实际的密码,但确实提供了有关用户使用密码的线索,并限制了暴力攻击和获取密码所需的工作。
  • 使用蛮力攻击更难破解存储的密码。最好在存储密码时使用许多(数千)轮哈希。
  • 使用更强大的哈希机制。随着技术的发展,SHA1和其他哈希算法的前身(例如MD5)已被证明非常容易破解。注意:NIST 在2011年已弃用。因此,如果您可以从mysql.user表中获取散列,或者通过嗅探未加密的通道,则可以对这些密码进行快速反向工程和破解,尤其是当密码较短(少于8个字符)时。另请参阅FIPS 180-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。

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

  • 支持TLS连接,无需任何额外的努力(服务器端支持和客户端端支持)以确保默认情况下连接是安全的
  • CREATE USER / ALTER USER提供了几个 选项来指定密码管理策略
  • 控制可以和不能用作密码的内容–长度,字符复杂度等。
  • 减慢蛮力尝试猜测密码会增加延迟以及设置最大尝试限制
  • 用随机一次密码重置密码。
  • 防止用户枚举的其他措施

这些功能与caching_sha2_password结合使用,可增强用户帐户抵御密码攻击的能力。

另外,mysql模式的数据可以在静态时进行加密(InnoDB加密, 二进制日志加密)。这样可以保护敏感数据,例如密码哈希,以防止未经授权的文件访问。这在OS /文件系统中隐藏了许多细节。FYI – 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新密码机制介绍caching_sha2_password的更多相关文章

  1. mysql学习------权限机制

    MySQL服务器通过MySQL权限表来控制用户对数据库的访问,MySQL权限表存放在mysql数据库里,由mysql_install_db脚本初始化.这些MySQL权限表分别user,db,table ...

  2. MAC 环境下 初始化新的mysql root 密码

    mac 环境下初始化mysql的root密码 关掉mysql服务,打开系统设置最后的mysql,然后将mysql先关掉 生成一个文件命名mysql-init,文件中放入:一句话,这句话不同版本不一样, ...

  3. Mysql锁机制介绍

    Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  4. windows下重置mysql的root密码方法介绍(转)

    自己在内网操作的,遇到了一些的问题,其中一个是需要重置密码的,所以网上找了两篇文章,都有一些借鉴的地方. 版本mysql5.7.2,linux系统 除了参考文章还有几点说明: service mysq ...

  5. MYsql 数据库密码忘记(Window)

    之前想在自己的机器上搭建一个数据库,但是又怕占用内存太大,因此特地从网上下载了一个绿色版,免安装版本的,开始用着 还可以,后来重启机器发现悲催了,数据库用不了了, 决心好好整整Mysql 我的是 版本 ...

  6. 使用Mysql修改密码命令更改root的密码

    使用Mysql修改密码命令更改root的密码. 进入Mysql数据库命令行方式有两种方式: 方式一:在Mysql开始菜单里包含Mysql命令行客户端,只要点击输入root的密码即可进入. 方式二:在D ...

  7. 几种破解MySQL root密码的几种方法:

    几种破解MySQL root密码的几种方法: 方法一 使用phpmyadmin,这是最简单的了,修改mysql库的user表,不过别忘了使用PASSWord函数. 方法二 使用mysqladmin,这 ...

  8. 使用SKIP-GRANT-TABLES 解决 MYSQL ROOT密码丢失(转)

    B.5.3.2 How to Reset the Root Password If you have never assigned a root password for MySQL, the ser ...

  9. MySQL的安全机制

    MySQL的安全机制: 1.MySQL登录 mysql -u账户 -p密码 -h127.0.0.1 -P端口 数据库名 mysql -h hostname|hostIP -p port -u user ...

随机推荐

  1. 微信小程序路由跳转(navigateTo,redirectTo ,switchTab ,reLaunch )

    navigateTo, redirectTo 只能打开非 tabBar 页面. switchTab 只能打开 tabBar 页面. reLaunch 可以打开任意页面. 通过redirect重定向的页 ...

  2. 【HBase】表的version

    建表.添加数据 Examples: hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40'] hbase> c ...

  3. Java实现 LeetCode 528 按权重随机选择(TreeMap)

    528. 按权重随机选择 给定一个正整数数组 w ,其中 w[i] 代表位置 i 的权重,请写一个函数 pickIndex ,它可以随机地获取位置 i,选取位置 i 的概率与 w[i] 成正比. 说明 ...

  4. java实现第四届蓝桥杯连号区间数

    连号区间数 题目描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R ...

  5. 数据结构:用实例分析ArrayList与LinkedList的读写性能

    目录 背景 ArrayList LinkedList 实例分析 1.增加数据 2.插入数据 3.遍历数据 3.1.LinkedList遍历改进 总结 背景 ArrayList与LinkedList是J ...

  6. 彻底搞懂 etcd 系列文章(三):etcd 集群运维部署

    0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...

  7. 分布式锁没那么难,手把手教你实现 Redis 分布锁!|保姆级教程

    书接上文 上篇文章「MySQL 可重复读,差点就让我背上了一个 P0 事故!」发布之后,收到很多小伙伴们的留言,从中又学习到很多,总结一下. 上篇文章可能举得例子有点不恰当,导致有些小伙伴没看懂为什么 ...

  8. 提高网站访问性能之Tomcat优化

    一.前言 tomcat 服务器在JavaEE项目中使用率非常高,所以在生产环境对tomcat的优化也变得非常重要了,对于tomcat的优化,主要是从2个方面入手,一是tomcat本身的配置,另一个是t ...

  9. vue甘特图gantt

    vue做甘特图,先大致介绍下核心功能: (1)横轴.纵轴拖拽: (2)自定义监听点击事件(双击.右键等)(3)任务之间显示父子层级关系:(4)左侧列表信息,右侧时间轴表示任务:(5)每个任务可以订制样 ...

  10. SpringBoot爬坑系列

    1.日志篇 现象 由于日志配置采用原来SpringMVC项目中的log4j.properties 文件,日志采用springboot自带的jar包会出现打印不出日志的情况. 解决 引入原日志包 < ...