Mysql身份认证过程
背景
最近有一些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身份认证过程
Client与Server建立TCP连接后,Server返回Initial Handshake Packet
,这个包中会携带Server默认的认证方式,因为此时还不清楚登录用户是谁,所以是无法返回准确的认证方式的。
mysql8.0这个值默认值为
caching_sha2_password
,低版本为mysql_native_password
Client会先以Server返回的认证方式对密码进行加密,然后通过Handshake Response Packet
发送给Server,这一轮交互完成后接下来会存在三种case:
- 认证失败。比如密码错误。
- 认证成功。成功建立了连接,接下来可以进行命令通信。
- 返回AuthMoreData包,这时又分为两种情况:
- 包第二个字节 = 0x03,随后是一个正常的 OK 数据包,这是当用户的密码已在Server缓存中并且身份验证已成功时的情况,这种称之为
“fast” authentication
。 - 包第二个字节 = 0x04,这意味着需要更多数据才能完成身份验证,在使用
caching_sha2_password
认证方式时,这意味着用户密码不在Server缓存中,Server要求Client发送用户的完整密码,这就是所谓的“full” authentication
。这时Client需要用Server的公钥对密码进行加密然后再次发送给Server。
- 包第二个字节 = 0x03,随后是一个正常的 OK 数据包,这是当用户的密码已在Server缓存中并且身份验证已成功时的情况,这种称之为
- 返回
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.user
的authentication_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 Hash
crypt.Reset()
crypt.Write(stage1)
hash := crypt.Sum(nil)
// outer Hash
crypt.Reset()
crypt.Write(scramble)
crypt.Write(hash)
scramble = crypt.Sum(nil)
// token = scrambleHash XOR stage1Hash
for i := range scramble {
scramble[i] ^= stage1[i]
}
return scramble
}
Client通过Handshake Response Packet
发送给Server,Server采用与Client相同的算法生成认证字符串,如果两端生成的一致则说明密码正确,认证通过。
caching_sha2_password
这种认证方式下存储在mysql.user
的authentication_string
字段中值为:
即利用盐值进行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解密后获取到密码明文然后得到哈希值判断密码是否正确。
Mysql身份认证过程的更多相关文章
- 基于X.509证书和SSL协议的身份认证过程实现(OpenSSL可以自己产生证书,有TCP通过SSL进行实际安全通讯的实际编程代码)good
上周帮一个童鞋做一个数字认证的实验,要求是编程实现一个基于X.509证书认证的过程,唉!可怜我那点薄弱的计算机网络安全的知识啊!只得恶补一下了. 首先来看看什么是X.509.所谓X.509其实是一种非 ...
- 深入解读 ASP.NET Core 身份认证过程
长话短说:上文我们讲了 ASP.NET Core 基于声明的访问控制到底是什么鬼? 今天我们乘胜追击:聊一聊ASP.NET Core 中的身份验证. 身份验证是确定用户身份的过程. 授权是确定用户是否 ...
- 【Shiro】Apache Shiro架构之身份认证(Authentication)
Shiro系列文章: [Shiro]Apache Shiro架构之权限认证(Authorization) [Shiro]Apache Shiro架构之集成web [Shiro]Apache Shiro ...
- 细说ASP.NET Forms身份认证
阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...
- Apache shiro集群实现 (三)shiro身份认证(Shiro Authentication)
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- 最简单易懂的Spring Security 身份认证流程讲解
最简单易懂的Spring Security 身份认证流程讲解 导言 相信大伙对Spring Security这个框架又爱又恨,爱它的强大,恨它的繁琐,其实这是一个误区,Spring Security确 ...
- 转:细说ASP.NET Windows身份认证
转自:https://www.cnblogs.com/fish-li/archive/2012/05/07/2486840.html 细说ASP.NET Windows身份认证 阅读目录 开始 认识A ...
- 认识ASP.NET Windows身份认证
本文摘自:细说ASP.NET Windows身份认证 Forms身份认证虽然使用广泛,不过,如果是在 Windows Active Directory 的环境中使用ASP.NET, 那么使用Windo ...
- DTLS协议中client/server的认证过程和密钥协商过程
我的总结:DTLS的握手就是协商出一个对称加密的秘钥(每个客户端的秘钥都会不一样),之后的通信就要这个秘钥进行加密通信.协商的过程要么使用非对称加密算法进行签名校验身份,要么通过客户端和服务器各自存对 ...
- ASP.NET Core Identity 实战(3)认证过程
如果你没接触过旧版Asp.Net Mvc中的 Authorize 或者 Cookie登陆,那么你一定会疑惑 认证这个名词,这太正式了,这到底代表这什么? 获取资源之前得先过两道关卡Authentica ...
随机推荐
- Angular 19 "要" 来了⚡
前言 Angular 19 预计会在 11 月中旬发布,目前 (2024-10-27) 最新版本是 v19.0.0-next.11. 这次 v19 的改动可不小哦,新增了很多功能,甚至连 effect ...
- 初识GO语言--高级数据类型
- 如何获取Flume连接HDFS所需要的包
在学习Hadoop工具中的Flume时,有的小伙伴会遇到这句话: "Flume要想将数据输出到HDFS,必须持有Hadoop相关jar包" 然后小伙伴就懵逼了,这些包要去什么地方来 ...
- Linux 练习
目录 练习一 练习2 练习一 分析日志t.log(访问量),将各个ip地址截取,并统计出现次数,并按从大到小排序(腾讯) 每行格式:http: //192.168.200.30/index1.html ...
- ARC121E Directed Tree
ARC121E Directed Tree 有意思的容斥加树 dp. 思路 \(a_i\) 可以是除去 \(i\) 祖先之外的所有点,考虑 \(a_i\) 的逆排列. 每一个 \(i\) 在正排列里都 ...
- rustlings v6.0 运行时出现 “ You are trying to run Rustlings using the old method before version 6”
背景 在之前学习 rust 时,使用过一段时间 rustlings 感觉还不错,但是之前的学习只把 rustlings 的题目刷了一半,然后想再从头到尾刷一遍 rustlings 的题目. 在 rus ...
- STM32的中断刨析(完结)
STM32中断刨析 一直以来,学习了 stm32 和 freertos 但在思考 RTOS 的任务调度时,涉及到 stm32 的中断相关的 PendSV 就感觉糊里糊涂.本篇记录刨析 stm32 的中 ...
- 基于知识图谱的医疗问答系统(dockerfile+docker-compose)
目录 一.搭建 Neo4j 图数据库 1.方式选择 2.Dockerfile+docker-compose部署neo4j容器 2.1.更新 yum 镜像源 2.2.安装 docker-ce 社区版 2 ...
- vue3 学习笔记(不断更新中...)(2024.11.13)
组合式API setup() 11 响应式API ref ref 用于创建响应式数据(通常用来定义 基本类型数据) 在JavaScript代码中,需要使用 .value 来操作数据 let count ...
- 【微软】微软程序注册(zfile自建API)
Zfile支持设置自己的回调地址,怎么设置呢? 参考:https://docs.zfile.vip/advanced/onedrive-api/ 上面文档写的很清楚了,我提醒两点 1.进入 https ...