我的用户正在使用 MS Access 和 ODBC 连接器连接到我的远程 MySQL 数据库。我想知道这有多安全,就可能向第三方泄露密码而言。mysql 协议认证对窃听甚至中间人攻击是否安全?我会很高兴能够防止窃听。请注意,我关心的只是身份验证,我不关心数据泄露。
请不要回复说我应该使用 SSL。我知道这将是理想的,但设置似乎并不简单。无论如何,我想知道纯 mysql 协议的安全级别是多少。
您想要“安全地进行窃听甚至中间人攻击”的是什么?你的密码,还是你的数据?
您的问题的标题专门指authentication。MySQL 在保护您的密码免受窃听方面做得很合理(它不是以明文形式发送的,并且使用 nonce 可以避免重放攻击)。引用 MySQL 协议内部:
MySQL 4.1 及更高版本
请记住 mysql.user.Password 存储 SHA1(SHA1(password))
- 服务器向客户端发送一个随机字符串(加扰)
- 客户计算:
- stage1_hash = SHA1(password),使用用户输入的密码。
- token = SHA1(scramble + SHA1(stage1_hash)) XOR stage1_hash
- 客户端将令牌发送到服务器
- 服务器计算
- stage1_hash' = token XOR SHA1(scramble + mysql.user.Password)
- 服务器比较 SHA1(stage1_hash') 和 mysql.user.Password
- 如果它们相同,则密码没问题。
(注 SHA1(A+B) 是 A 与 B 连接的 SHA1。)
该协议修复了旧协议的缺陷,无论是在线窥探还是 mysql.user.Password 都不足以成功连接。但是当一个人同时拥有 mysql.user.Password 和网络上截获的数据时,他就有足够的信息来连接。
但是,经过身份验证的会话以明文形式继续:窃听者将能够看到所有查询和结果;并且 MITM 将能够对其进行更改。如手册所述:
默认情况下,MySQL 在客户端和服务器之间使用未加密的连接。这意味着有权访问网络的人可以查看您的所有流量并查看正在发送或接收的数据。他们甚至可以在客户端和服务器之间传输数据时更改数据。
虽然您可能不喜欢这个答案,但 SSL 是一种旨在击败数据窃听(通信如何加密?)和 MITM 攻击(任何一方如何验证其对等方是它认为的人?)的工具。事实上,如果 mysql 客户端-服务器协议单独击败了这些威胁,那么就没有理由在 SSL 上使用 mysql(因此它不太可能成为受支持的配置)。
简短的回答:是的,该协议可以免受窃听和 MITM 攻击。
只有当攻击者设法嗅探身份验证尝试并且攻击者知道 mysql.user 的内容时,他才能随后对服务器进行身份验证。例如,如果您在两台不同的 mysql 服务器上使用相同的密码,并且攻击者获得了其中一台的访问权限,他也可以连接到第二台服务器。