首先Mysql的安全密码权限存储在mysql.user表中。我们不关注鉴权的登陆部分,我们只关心身份认证,安全识别身份,登陆后面的安全权限控制是很简单的事情。 在mysql.user表中有个authentication_string字段,登陆存储的安全是密码的两次sha1值。 你可以用下面的登陆语句,验证和mysql.user表中存储的安全是一致的。 select sha1(UNHEX(sha1(‘password’))) 以上就是登陆服务端关于密码的存储,接下来是安全认证过程。服务器托管 Mysql采用的登陆是一种challenge/response(挑战-应答)的认证模式。 ***步:客户端连接服务器 第二步:服务器发送随机字符串challenge给客户端 第三步:客户端发送username+response给服务器 其中response=HEX(SHA1(password) ^ SHA1(challenge + SHA1(SHA1(password)))) 第四步:服务器验证response。安全 服务器存储了SHA1(SHA1(password))) 所以可以计算得到SHA1(challenge + SHA1(SHA1(password)))) 那么SHA1(password)=response^ SHA1(challenge + SHA1(SHA1(password)))) ***再对SHA1(password)求一次sha1和存储的登陆数据进行比对,一致表示认证成功。安全 我们分析它的安全性: 当然如果被抓包同时数据库泄密,就可以得到sha1(password),就可以仿冒登陆了。 这种认证方式其实是有一个框架标准的源码库,叫做SASL(Simple Authentication and Security Layer ),专门用于C/S模式下的用户名密码认证。原理就是服务器发送一个挑战字challenge给客户端,客户端返回的response证明自己拥有密码,从而完成认证的过程,整个过程不需要密码明文在网络上传输。 基于SASL协议有很多实现,mysql的就是模仿的CRAM-MD5协议,再比如SCRAM-SHA1协议,是mongdb、PostgreSQL 使用的认证方式。在JDK中专门有一套SASL的API,用于实现不同的SASL认证方式。网站模板