Mysql身份认证过程

news/2025/1/13 9:38:48/文章来源:https://www.cnblogs.com/orlion/p/18667930

背景

最近有一些hersql的用户希望能支持mysql的caching_sha2_password认证方式,caching_sha2_password与常用的mysql_native_password认证过程差异还是比较大的,因此抽空研究了一下caching_sha2_password身份认证过程,并为hersql支持了caching_sha2_password的能力

hersql是我开源的一款通过http隧道来代理mysql的工具,可以通过http服务来穿透内网的mysql server,地址:github.com/Orlion/hersql

mysql身份认证过程

image.png

Client与Server建立TCP连接后,Server返回Initial Handshake Packet,这个包中会携带Server默认的认证方式,因为此时还不清楚登录用户是谁,所以是无法返回准确的认证方式的。

mysql8.0这个值默认值为caching_sha2_password,低版本为mysql_native_password

Client会先以Server返回的认证方式对密码进行加密,然后通过Handshake Response Packet发送给Server,这一轮交互完成后接下来会存在三种case:

  1. 认证失败。比如密码错误。
  2. 认证成功。成功建立了连接,接下来可以进行命令通信。
  3. 返回AuthMoreData包,这时又分为两种情况:
    • 包第二个字节 = 0x03,随后是一个正常的 OK 数据包,这是当用户的密码已在Server缓存中并且身份验证已成功时的情况,这种称之为“fast” authentication
    • 包第二个字节 = 0x04,这意味着需要更多数据才能完成身份验证,在使用caching_sha2_password 认证方式时,这意味着用户密码不在Server缓存中,Server要求Client发送用户的完整密码,这就是所谓的“full” authentication。这时Client需要用Server的公钥对密码进行加密然后再次发送给Server。
  4. 返回auth switch”包。Server收到Handshake Response Packet后会查询登录用户的认证方式,如果首次认证使用的认证方式与用户指定的认证方式不同,需要进行切换,会在auth switch包中携带准确的认证方式。接下来Client要用Server返回的这个准确的认证方式重新发起一轮认证请求。

mysql_native_password

mysql_native_password 身份验证插件从 MySQL 8.0.34 开始已弃用,在 MySQL 8.4 中默认禁用,并从 MySQL 9.0.0 开始删除。

用户密码存储在mysql.userauthentication_string字段中。在mysql_native_password认证方式下Server端存储的用户密码为原始密码经过两个sha1后的哈希值,没有经过加盐,因此相同的密码存储的值是相同的。

通讯过程简析

Server端会在Initial Handshake Packet返回一个随机数,Client收到之后首先与Server相同的对原始密码进行两次sha1,然后把Server返回的随机数加到摘要中,最终进行一个异或运算,得到最终的认证字符串:

// Hash password using 4.1+ method (SHA1)
func scramblePassword(scramble []byte, password string) []byte {if len(password) == 0 {return nil}// stage1Hash = SHA1(password)crypt := sha1.New()crypt.Write([]byte(password))stage1 := crypt.Sum(nil)// scrambleHash = SHA1(scramble + SHA1(stage1Hash))// inner Hashcrypt.Reset()crypt.Write(stage1)hash := crypt.Sum(nil)// outer Hashcrypt.Reset()crypt.Write(scramble)crypt.Write(hash)scramble = crypt.Sum(nil)// token = scrambleHash XOR stage1Hashfor i := range scramble {scramble[i] ^= stage1[i]}return scramble
}

Client通过Handshake Response Packet发送给Server,Server采用与Client相同的算法生成认证字符串,如果两端生成的一致则说明密码正确,认证通过。

caching_sha2_password

这种认证方式下存储在mysql.userauthentication_string字段中值为:

image.png

即利用盐值进行5000轮SHA256哈希。

通讯过程简析

同样Server端会先返回一个随机数,Client生成认证字符串的算法为XOR(SHA256(password), SHA256(SHA256(SHA256(password)), scramble))。Server端收到Handshake Response Packet之后首先会检查username/SHA256(SHA256(user_password)) 是否与缓存匹配,如果匹配则认证成功。如果没有匹配的缓存则则要求Client通过SSL连接或者RSA公钥对密码进行加密后再次发送给Server端,Server解密后获取到密码明文然后得到哈希值判断密码是否正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868597.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cloudflare Pages 搭建 DockerHub 镜像加速器

登录https://dash.cloudflare.com/ 进入Workers创建一个Worker名称随意,然后点击部署编辑代码访问https://github.com/cmliu/CF-Workers-docker.io/blob/main/_worker.js 复制代码将代码全部替换点部署刷新预览后显示搜索框部署成功 点返回,然后选择设置,点添加自定义域名填…

开箱即用!一款支持多个大语言模型服务的桌面客户端!

Cherry Studio —— 一款支持多个大语言模型(LLM)服务的桌面客户端,兼容 Windows、Mac 和 Linux 系统。大家好,我是 Java陈序员。 可以说现在 AI 给我们的生活、工作带来了极大的便利,各种大语言模型层出不穷,功能多样。 今天,给大家介绍一款支持多模型服务的桌面客户端…

N皇后问题

题目 n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上,并且使皇后彼此之间不能相互攻击(每一行,每一列,每个对角线上只能有一个皇后存在)。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。 示例 1:输入:n = 4 输出:2 解释:如上图所示,4 皇后问题…

掌握设计模式--代理模式

代理模式(Proxy Pattern) 代理模式(Proxy Pattern)是一种结构型设计模式,允许你通过代理对象来控制对其他对象的访问。代理模式的主要目的是通过代理对象来控制原对象的访问、延迟加载、权限控制等。 组成结构Subject(主题接口):定义了真实对象和代理对象的共同接口。 …

前端实现 HTML 网页转 PDF 并导出

有个新需求,当点击【下载】按钮时,直接将当前 html页面下载为 PDF。通过 html2canvas + jsPDF 可实现PDF单页下载,甚至是多页下载,记录分享一下~ 最后有样式源码,可自取🫡有个新需求,当点击【下载】按钮时,直接将当前 html页面下载为 PDF。通过 html2canvas + jsPDF 可…

AI应用实战课学习总结(5)回归分析预测实战

本文介绍了机器学习中的起点:回归分析,并进行了一个电商用户生命周期价值(LTV)的分析预测实战,最后还进行了多种回归模型的拟合效果对比,相信你会有一个直观的印象。大家好,我是Edison。 最近入坑黄佳老师的《AI应用实战课》,记录下我的学习之旅,也算是总结回顾。 今天…

Gitlab Runner安装与配置

由于格式和图片解析问题,为了更好阅读体验可前往 阅读原文本篇使用Docker安装Gitlab runner进行runner的安装和注册,其他方式请参考官方文档非Docker安装Gitlab runner请确保runner版本和gitlab版本兼容以及docker相关版本兼容问题下载镜像 docker pull gitlab/gitlab-runner…

笔记本电脑清灰以及升级硬盘与内存

1、工具准备(1)螺丝刀:最好使用手柄较粗(容易发力)、有磁吸(螺丝不易掉)、以及批头可以替换的螺丝刀。(2)撬片:拆机常用的是三角撬片,越薄越好;没有的话也可以用废弃的银行卡替代。(3)磁吸定位板:用于存放螺丝,没有的话也可以用瓶盖替代。(4)气吹与毛刷:用于…

读量子霸权02数字时代的终结

2000年前希腊人创造的安提基西拉仪器是计算机雏形,可计算月球运转。安提基西拉代表古代模拟宇宙巅峰。巴比奇未实现最先进机械计算机梦想。图灵被誉为“计算机科学之父”,提出图灵机概念。数字计算机比模拟计算机准确。图灵测试提出机器能否像人思考。1. 爱琴海的海底 1.1. 2…

行为树(BehaviorTree )的实现与应用

前言 我最近学习使用C#脚本实现Unity行为树,并使用行为树实现了对“空洞骑士”中,“假骑士”的AI行为逻辑的简单实现。本文主要记录了在这个过程中的一些要点。 行为树的原理及实现教程来自这位大佬的博客:游戏AI行为决策——Behavior Tree(行为树) 一、运作逻辑 行为树的…

48. django下载与基本使用

1.版本 django1.x:默认不支持异步 django2.x:默认不支持异步 django3.x:自带异步功能 2. 下载 2.1 pip安装pip install django==3.2.122.2 安装注意事项 计算机名称不能出现中文 注意python解释器版本与django版本的兼容性 项目中的文件名称不能出现中文 多个项目文件尽量不…

互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入门开始

前言 为什么我会想着制作一个智能桌面机器人呢?自问自答一下,看过我之前文章的小伙伴应该都知道我之前有为稚晖君开源的ElectronBot桌面机器人开发过一个桌面上位机软件叫电子脑壳,由于ElectronBot桌面机器人必须连接电脑才能使用,所以限制比较多,网友又对独立版本的桌面机…