作者:大岩不灿
首先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和存储的数据进行比对,一致表示认证成功。
我们分析它的安全性:
抓包可以得到response,但是每次认证服务器都会生成challenge,所以通过抓包无法构造登陆信息。数据库内容被偷窥,数据库记录的是sha1(sha1(password)),不可以得到sha1(password)和明文密码,所以无法构造response,同样无法登陆。当然如果被抓包同时数据库泄密,就可以得到sha1(password),就可以仿冒登陆了。
这种认证方式其实是有一个框架标准的,叫做SASL(Simple Authentication and Security Layer ),专门用于C/S模式下的用户名密码认证。原理就是服务器发送一个挑战字challenge给客户端,客户端返回的response证明自己拥有密码,从而完成认证的过程,整个过程不需要密码明文在网络上传输。
基于SASL协议有很多实现,mysql的就是模仿的CRAM-MD5协议,再比如SCRAM-SHA1协议,是mongdb、PostgreSQL 使用的认证方式。在JDK中专门有一套SASL的API,用于实现不同的SASL认证方式。
- 华为发布AI数据湖解决方案,助力企业加速拥抱AI
- 工信部等七部门联合发文!以数智化赋能医药工业全链条转型升级
- 擎画算力赋能新蓝图,城市算网专家座谈会在京成功举办
- 2024年Q4全球服务器收入773亿美元同比增91%,非x86占比225亿美元同比增262.1%
- 面向全球!华为发布IOC机场智能运控中心等五大航空解决方案
- 微软停止中国区运营?系外包公司,约2000人项目组被裁撤
- 第九届华为ICT大赛中国总决赛收官 84支队伍晋级全球总决赛
- 联想集团黄建恒:SSG业务已连续15个季度双位数增长
- 联想集团ISG总裁:已将多款畅销服务器进行升级
- 全球超大规模数据中心数量五年翻倍,2024年新增137个!
免责声明:本网站内容主要来自原创、合作伙伴供稿和第三方自媒体作者投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。任何单位或个人认为本网站中的网页或链接内容可能涉嫌侵犯其知识产权或存在不实内容时,应及时向本网站提出书面权利通知或不实情况说明,并提供身份证明、权属证明及详细侵权或不实情况证明。本网站在收到上述法律文件后,将会依法尽快联系相关文章源头核实,沟通删除相关内容或断开相关链接。