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身份认证过程

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 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.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解密后获取到密码明文然后得到哈希值判断密码是否正确。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/6662.html

(0)
LomuLomu
上一篇 2025 年 1 月 16 日 上午3:25
下一篇 2025 年 1 月 16 日

相关推荐

  • Java与MySQL数据库交互实战指南

    Java开发中的MySQL数据库操作实践 在当今软件开发领域,数据库扮演着至关重要的角色。作为主流的编程语言之一,Java为数据库操作提供了强大的支持。本指南将全面讲解如何使用Java程序连接MySQL数据库,并完成常见的数据操作任务。 一、前期准备工作 1.1 MySQL环境搭建 首先需要确保本地已安装MySQL数据库服务端。建议从MySQL官方网站获取最…

    未分类 2025 年 5 月 19 日
    12300
  • o3 发布了,摔碎了码农的饭碗

    大家好,我是汤师爷~ 在 2024 年底,OpenAI 发布了最新推理模型 o3。o3模型相当炸裂,在世界级编程比赛中拿下第 175 名,打败 99.9% 的参赛者。AI 写代码都赶上顶级程序员了,程序员是不是要失业? 最近不少读者反馈,像 GitHub Copilot、Claude Sonnet 3.5、Cursor 等 AI 辅助编程工具,能让代码编写效…

    2025 年 1 月 14 日
    30600
  • manim边学边做–移动动画

    在Manim动画库中,实现直线移动动画是一项基础而直接的任务,每个Mobject对象都配备了animate属性,使得通过obj.animate.shift()或obj.animate.move_to()将对象从一个位置移动到另一个位置变得轻而易举。 然而,对于需要遵循复杂路径的移动动画,标准的animate方法就显得力不从心了。本文将深入探讨Manim中两个…

    未分类 2024 年 12 月 26 日
    34400
  • 2025新春源码免费送

    我们常常在日常生活中感到时间过得异常缓慢,仿佛未来遥不可及。然而,当我们回过头去审视过去,才发现时间早已悄然溜走,许多曾经等待的日子已经过去。时间总是在不经意间流逝,让人意识到它的宝贵和不可逆转。 尽管如此,我们依然应对未来保持从容的态度。生活充满了无数的可能性,未来依然充满了希望与机会。无论眼前的路看似如何曲折,抑或我们面临的挑战有多大,始终相信自己能够把…

    2025 年 1 月 10 日
    31700
  • 2025年MacBook苹果电脑多版本JDK安装与环境配置指南:从JDK8到JDK22的完整教程

    本指南最后更新于:2024年11月28日,包含最新版本支持。重要更新记录:- 2024年02月:新增JDK17环境配置- 2024年05月:解决Maven与JDK版本切换冲突问题- 2024年06月:针对M系列芯片用户推荐ARM版本- 2024年08月:新增JDK22支持- 2024年11月:优化内容排版与视觉效果 本教程所有操作步骤均经过实际验证,确保可行…

    2025 年 5 月 19 日
    62000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信