首先,mysql的密码权限存放在mysql.user表中。认证部分我们不关注,只关心身份认证和身份识别,后面的权限控制是很简单的事情。mysql.user表中有一个authentication_string字段,里面存放的是密码的两个sha1值。您可以使用以下语句来验证它是否与mysql.user表中存储的内容一致。selectsha1(UNHEX(sha1('password')))上面是服务器端密码的存储,后面是认证过程。Mysql采用挑战/响应(challenge-response)认证模式。第一步:客户端连接到服务器第二步:服务器向客户端发送一个随机字符串挑战第三步:客户端向服务器发送用户名+响应其中response=HEX(SHA1(密码)^SHA1(challenge+SHA1(SHA1(password))))第4步:服务器验证响应。服务器存储SHA1(SHA1(password))),所以可以计算出SHA1(challenge+SHA1(SHA1(password)))),则SHA1(password)=response^SHA1(challenge+SHA1(SHA1(password))))***将SHA1(password)与存储的数据进行比较,发现认证成功。我们分析它的安全性:通过抓包可以得到响应,但是认证服务器每次都会产生一个challenge,所以不能通过抓包构造登录信息。窥视数据库内容,数据库记录sha1(sha1(password)),获取不到sha1(password)和明文密码,所以无法构造响应,同样无法登录。当然,如果抓包同时泄露了数据库,就可以拿到sha1(密码),冒用登录。这种认证方式其实有一个框架标准叫做SASL(SimpleAuthenticationandSecurityLayer),专门用于C/S模式下的用户名密码认证。其原理是服务器向客户端发送一个挑战词challenge,客户端返回的响应证明自己有密码,从而完成认证过程。整个过程不需要密码以明文形式在网络上传输。基于SASL协议的实现有很多。Mysql是在模仿CRAM-MD5协议。另一个例子是SCRAM-SHA1协议,它是mongdb和PostgreSQL使用的身份验证方法。JDK中有一套特殊的SASLAPI,用于实现不同的SASL认证方式。