Mysql是如何做到安全登陆

发表于:2017-11-16 09:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:大岩不灿    来源:51Testing软件测试网采编

  首先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认证方式。
  End.
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号