zoukankan      html  css  js  c++  java
  • MySQL是如何做到安全登陆

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

  • 相关阅读:
    VC 常见问题百问
    python windows 环境变量
    Check server headers and verify HTTP Status Codes
    Where are the AES 256bit cipher suites? Please someone help
    outlook 如何预订会议和会议室
    安装Axis2的eclipse插件后,未出现界面
    windows 环境变量
    python 时间日期处理汇集
    openldap学习笔记(使用openldap2.3.32)
    set p4 environment in windows
  • 原文地址:https://www.cnblogs.com/rinack/p/7872788.html
Copyright © 2011-2022 走看看