首先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认证方式。

最新文章

  1. JavaScript(五)——插入地图
  2. [QGLViewer]First Demo
  3. 列间距column-gap
  4. stm32类型cl、vl、xl、ld、md、hd的含义
  5. HDu -2844 Coins多重背包
  6. 几个因为hadoop配置文件不当造成的错误
  7. perl 读取cookie
  8. 开源自己写的图片转Ascii码图工具
  9. Cocos Creator 监听安卓屏幕下方返回键
  10. [iptables] 如何用iptables管理桥接模式下的设备
  11. php 微信支付V3 APP支付
  12. Redshift中查看database、schema、table数据大小
  13. Windows:服务已经标记为删除
  14. Python2.7-dbm、gdbm、dbhash、bsddb、dumbdb
  15. 如何正确的重写equals() 和 hashCode()方法
  16. java在编译期和运行期都做了什么
  17. 退出Vi(m)
  18. BZOJ3963: [WF2011]MachineWorks 【CDQ+斜率优化DP】*
  19. day--42 前端基础小结
  20. vray学习笔记(5)-学习资料

热门文章

  1. web小流量实验方案
  2. VS收集插件
  3. HDU 3949 XOR 高斯消元
  4. 深度Linux Deepin系统安装教程使用体验
  5. Hive配置与操作实践
  6. WebApi-如何实现接口加密
  7. win10 mysql57密码重置
  8. 算法笔记_018:旅行商问题(Java)
  9. TP框架中field查询字段
  10. How to add a button in the seletions "More"