MySQL是如何做到安全登陆

数据库 MySQL
首先Mysql的密码权限存储在mysql.user表中。我们不关注鉴权的部分,我们只关心身份认证,识别身份,后面的权限控制是很简单的事情。

[[209808]]

首先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和存储的数据进行比对,一致表示认证成功。

我们分析它的安全性:

  1. 抓包可以得到response,但是每次认证服务器都会生成challenge,所以通过抓包无法构造登陆信息。
  2. 数据库内容被偷窥,数据库记录的是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认证方式。 

责任编辑:庞桂玉 来源: 36大数据
相关推荐

2021-08-02 09:01:05

MySQL 多版本并发数据库

2010-05-20 17:29:02

IIS安全

2023-11-30 10:13:17

TensorRT架构

2011-11-09 15:49:52

API

2011-07-25 10:24:00

2009-11-20 11:37:11

Oracle完全卸载

2016-11-30 14:18:30

互联网

2011-09-01 11:08:41

安全登陆Windows服务器网络安全

2016-01-08 10:03:07

硅谷通吃互联网

2019-08-08 10:18:15

运维架构技术

2010-03-30 10:44:05

Nginx启动

2022-09-09 08:41:43

Netty服务端驱动

2021-05-24 10:55:05

Netty单机并发

2019-12-23 09:25:29

日志Kafka消息队列

2019-01-03 14:00:37

降价青云全栈云

2013-01-06 10:57:03

2011-06-22 09:45:46

JavaScriptAPI

2017-12-05 11:48:44

AI人工智能开发者

2020-06-01 08:41:29

苏宁分析大数据

2024-03-08 07:58:13

QPShttpsync
点赞
收藏

51CTO技术栈公众号