我目前正在构建一个客户端而不使用任何库只是为了真正理解协议,当我将计算出的Auth数据包发送到MySQL服务器时,我对访问被拒绝回复感到困惑。 Mysql服务器只是在我的计算机上运行的本地服务器,用于测试目的。以下是我发送的信息:
测试密码为'peanut'。
第1阶段哈希 = b14ab480028768cb748fd97de56144a304eb8a1a
第2阶段哈希 = fd62797ed464c2843942a9167cc0521779d68862 - 这是正确的但数据库中没有*。
Salt&阶段2哈希 = rC8 / $ a?Vr \ W | .jN)~cVcfd62797ed464c2843942a9167cc0521779d68862
SHA1(Salt + Stage 2 Hash)XOR Stage 1 Hash = 4B19199ECEB929469EA89C0E942D8D5B9ACBE237
发送到服务器的字符串以十六进制身份验证:
\ x3A \ x00 \ x00 \ x01 - 标准标题(有效负载长度/序列号)
\ x02 \ x04 \ x80 \ x00 - 兼容性标记
\ x00 \ x00 \ x00 \ x01 - 最大数据包大小
\ x08 - Charset
\ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ x00 - 23字节填充
\ x72 \ x6F \ x6F \ x74 \ x00 - 用户名零终止
\ x14 - 令牌长度(20字节)
\ X4B \ X19 \ X19 \ x9E \ XCE \ xB9 \ X29 \ X46 \ x9E \ xA8 \ x9C \ x0E \ X94 \ X2D \ x8D \ x5B \ x9A \ XCB \ XE2 \ X37 - 令牌
当我发送此字符串时,服务器只发出拒绝访问的#28000错误。
这可能是访问权限问题吗?尝试获取root访问权限的远程用户是否需要启用?
我已经更改了连接超时设置wait_timeout / connect_timeout等,仍然没有快乐,这些设置为60秒。
我不确定是否应该使用星号计算SHA1(Salt + Stage 2 Hash),因为数据库在密码之前显示*。我尝试了两种方式,但仍然没有认证。
我现在用完了想法,我能想到的另一件事就是编写另一个程序来处理客户端令牌,就像Mysql Server一样,但我想我会先在这里仔细检查一下。
我现在已经做了一段时间了,我很难过。
任何帮助非常感谢。我通常不会在论坛上发帖,所以这是一种新的体验,对不起,如果我没有遵循礼仪。
此致
詹姆斯
答案 0 :(得分:0)
我自己没有查看协议文档,很难在这里看到任何错误。它可能是从字节顺序到错误的填充,长度和其他计算等等。服务器没有提供有关登录可能失败的原因的更多详细信息,因为这会泄漏信息给潜在的攻击者。
我建议您抓住MySQL源代码并查看他们如何在命令行应用程序中执行此操作。有关一些介绍和下载链接,请参阅http://dev.mysql.com/doc/internals/en/guided-tour.html。
除此之外,总是可以选择使用Wireshark记录网络流量,以查看库存mysql客户端发送的内容并将其与您拥有的内容进行比较。这可能有助于弄清楚填充等。 请注意,如果您正在使用Windows,那么捕获localhost上的流量可能会出现问题,因为IIRC Windows会以某种方式快速切换流量,因此它无法通过Wireshark的网络接口查看。在这种情况下,您可能必须在VM或其他计算机上设置MySQL服务器。