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

MySQL是如何做到安全登陆的更多相关文章

  1. MySQL Study之--MySQL普通用户无法本地登陆

    MySQL Study之--MySQL普通用户无法本地登陆       在安装完毕MySQL后,我们通常加入拥有对应权限的普通用户用来訪问数据库.在使用用户本地登录数据库的时候,常常会出现怎么登录也无 ...

  2. Ubuntu18.04 安装MySQL(Linux)解决登陆权限问题及Navicat for mysql 中文乱码问题

    一.MySQL(Linux)解决登陆权限问题 Ubuntu18.04 安装mysql或者mariadb之后,发现普通用户和远程都没有权限连接. ERROR 1045: Access denied fo ...

  3. Mysql空用户导致数据库登陆故障处理 (原创帖,转载请注明出处)

    首先感谢在本次故障中阿铭对我的无私帮助,万分感谢!阿铭linux论坛:http://www.apelearn.com/study_v2/   问题描述: 公司安全部门扫描到数据库空密码漏洞,用户名密码 ...

  4. mysql创建用户后无法登陆

    创建用户后登陆失败的原因是存在匿名用户: root@controller:~# mysql -h localhost -uaa -ppassword ERROR 1045 (28000): Acces ...

  5. MySQL学习笔记(1) - cmd登陆和退出

    1. 打开cmd,输入,回车 mysql -uroot -p -P3306 -h127. 1)-u :指定用户名,root为超级权限用户. 2)-p :输入密码,不指定时回车后会提示输入密码,并用*号 ...

  6. MySQL 设置cmd命令行登陆

    1.MySQL自带工具的存放路径: D:\Program Files\MySQL\MySQL Server 5.6\bin 为了方便使用,我们可以将以上路径添加到系统的环境变量path中 如果你不放, ...

  7. 【C#】【MySQL】C#连接MySQL数据库(三)登陆注册代码

    项目结构 项目代码 WebForm_Login.aspx <%@ Page Language="C#" AutoEventWireup="true" Co ...

  8. MySQL 数据库中用户表中口令登陆设置

    工具:MyEclipse8.5.apache-tomcat-6.0.43.MySQL5.6 问题:项目是同事发给我,正常运行之后,使用MySQL表里的管理员数据登陆时,提示“仅限于非总部工号登录!” ...

  9. mysql创建新用户及新用户不能本地登陆的问题

    最近在搭建hadoop集群,主节点上面安装的MySQL数据库,对着方面不熟悉,为hive.Ooize等服务统一使用的root账号和密码,为了安全一些库对于某些用户是不可见的,所以需要针对不同的服务设置 ...

随机推荐

  1. Spring Bean 注入 2 注解篇

    1. 自动装配注解 配置applicationContext.xml开启注解 <?xml version="1.0" encoding="UTF-8"?& ...

  2. QT在windows下的安装与配置

    先了解Qt: Qt一直以来,分为商业.开源两个版本,商业版本为用户提供了二级制的动态库,直接安装既可以使用,但是需要花钱购买license,而开源版本则遵守GPL协议,提供了源码,用户需要自行编译,才 ...

  3. Node Server零基础——开发环境文件自动重载

    收录待用,修改转载已取得腾讯云授权 前言 在 web 前端开发中,我们会借助 Grunt.Gulp 和 Webpack 等工具的 Watch 模块去监听文件变化,那服务端应该怎么做?其实文件变化的监听 ...

  4. 理解 select poll epoll

    举例说明:老师收学生作业,相当于应用层调用I/O操作. 1.老师逐个收学生作业,学生没有做完,只能阻塞等待,收了之后,再去收下一个学生的作业.这显然存在性能问题. 2.怎么解决上面的问题? 老师找个班 ...

  5. C#基础视频教程6.2 如何简单读写数据库

    上一节我们简单介绍了数据库的读写,所使用的数据库都是随便写的(用水果代替,但不是真正的食品零售数据表,至少没有价格,销量等等).这一节我们思考如何实现一个测试题的数据库,所谓的测试题数据库就是假定系统 ...

  6. CSS如何实现自定义鼠标应用到整个网页

    在CSS区把body改为*即可.但是注意Firefox不支持ani和cur文件,如果您一定想使用ani和cur的指针,可以试着将它改名为.gif文件.实际测试如果改为gif则IE也不支持了.

  7. Android应用更新自动检测下载

    由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必 ...

  8. Java线程-volatile不能保证原子性

    下面是一共通过volatile实现原子性的例子: 通过建立100个线程,计算number这个变量最后的结果. package com.Sychronized; public class Volatil ...

  9. Mybatis 通过扫描 自动生成别名

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ...

  10. hdu 4742 Pinball Game 3D(三维LIS&amp;cdq分治&amp;BIT维护最值)

    Pinball Game 3D Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...