IT评测·应用市场-qidao123.com技术社区

标题: Mysql身份认证过程 [打印本页]

作者: 小小小幸运    时间: 2025-1-13 10:46
标题: 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:
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返回的随机数加到摘要中,最终进行一个异或运算,得到最终的认证字符串:
  1. // Hash password using 4.1+ method (SHA1)
  2. func scramblePassword(scramble []byte, password string) []byte {
  3.         if len(password) == 0 {
  4.                 return nil
  5.         }
  6.         // stage1Hash = SHA1(password)
  7.         crypt := sha1.New()
  8.         crypt.Write([]byte(password))
  9.         stage1 := crypt.Sum(nil)
  10.         // scrambleHash = SHA1(scramble + SHA1(stage1Hash))
  11.         // inner Hash
  12.         crypt.Reset()
  13.         crypt.Write(stage1)
  14.         hash := crypt.Sum(nil)
  15.         // outer Hash
  16.         crypt.Reset()
  17.         crypt.Write(scramble)
  18.         crypt.Write(hash)
  19.         scramble = crypt.Sum(nil)
  20.         // token = scrambleHash XOR stage1Hash
  21.         for i := range scramble {
  22.                 scramble[i] ^= stage1[i]
  23.         }
  24.         return scramble
  25. }
复制代码
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解密后获取到密码明文然后得到哈希值判断密码是否正确。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4