MySQL协议-python版密码解密
0x00 简介
MySQL用户账户列于mysql数据库中的user表内。每个MySQL账户指定一个密码,尽管保存在user表Password列的密码不是明文,但哈希值是从表中的记录计算的。用PASSWORD()函数来计算密码的哈希值。
MySQL在客户端/服务器通信的两个阶段使用密码:
· 如果客户端试图连接服务器,有一个初始鉴定步骤,客户必须提供一个密码,并且必须与客户想要使用的账户在user表保存的哈希值匹配。
· 客户端连接后,它可以(如果有充分的权限) 设置或更改user表内所列的账户的密码哈希值值。客户端可以通过PASSWORD()函数来生成密码哈希值,或使用GRANT或SET PASSWORD语句。
本文将介绍MySQL数据库使用的两种不同的哈希加密方法,需要说的是,从4.1版本之后,MySQL的哈希算法就已经很完善了。
0x01 MySQL Pre-4.1 版本 哈希方法
MySQL 4.1以前,数据库中保存的password 哈希是通过PASSWORD()函数计算出来的16个字节长度的字符串,示例如下:
mysql_3.23> SELECT PASSWORD('mypass');
+--------------------+
| PASSWORD('mypass') |
+--------------------+
| 6f8c114b58f2ce9e |
+--------------------+
有人把这种加密方式称为"mysql323",然而,并没有有什么卵用。正如之前的博文介绍的授权认证方式,由于mysql323的哈希长度只有16字节,转换成binary也就8个字节,很容易被碰撞破解。大概在2000年开始逐渐退出历史的舞台。
0x01 MySQL 4.1 及以上版本 哈希方法
基于mysql323的不足,开发者设计了一套新的哈希算法:
- 更复杂的PASSWORD() 函数
- 增长Password哈希值存储长度
- 调整默认哈希方法
- 调整远程连接授权认证的哈希方法
- password哈希值以*开始
在MySQL4.1中,哈希方法会计算出一个41字节长度的哈希值保存在数据库,当然,41 = 40+1的这个1是*字符,示例如下:
mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
花样不多,就是长度增加了一倍,就是这样简单粗暴的加固方案。
算法:
- 对password两次sha1
python代码:
import hashlib
hash1 = hashlib.sha1(passwd).digest()
reuslt = hashlib.sha1(hash1).hexdigest()
# 输出结果为6c8989366eaf75bb670ad8ea7a7fc1176a95cef4
print reuslt
mysql命令:
mysql> SELECT SHA1(UNHEX(SHA1("mypass")));
+------------------------------------------+
| SHA1(UNHEX(SHA1("mypass"))) |
+------------------------------------------+
| 6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+------------------------------------------+
1 row in set (0.00 sec)
0x02 题外话
下面是初步判断,还没用过mysql 5.6以上的版本。。
MySQL 5.6版本开始远程授权认证过程的基础哈希改成了sha256,保存在数据库中的哈希值还是sha1的结果。
0x03 MySQL pre-4.1哈希破解代码
由于pre-4.1的哈希太弱,容易被碰撞,老外提了个CVE,编号CVE-2000-0981,有一篇比较详细的研究报告【传送门】,有兴趣的同学可以看看。
另外附赠破解的poc源码【 传送门】
0x04 参考文献
https://blog.csdn.net/paul123456789io/article/details/53081921
https://stackoverflow.com/questions/5654819/how-can-i-decrypt-mysql-passwords
http://www.iteedu.com/database/mysql/mysqlmanualcn/database-administration/password-hashing.php
https://dev.mysql.com/doc/refman/5.6/en/sha256-pluggable-authentication.html
https://dev.mysql.com/doc/refman/5.6/en/set-password.html
相关文章
- How to run python interactive in current file's directory in Visual Studio Code? Python路径问题
- python是否存在某个字符串 效率最高_Python中判断子串存在的性能比较及分析总结...
- python - 如何使用 Docker 运行多个 Python 脚本和一个可执行文件?
- python基础——错误处理
- [MySQL] mysql地理位置服务geometry字段类型
- mysql 几阶b树_在学到MySQL索引时,涉及到了B树和B+树.聊一聊
- MySQL mysqldump备份数据库及恢复数据库(mysql命令)
- 【MySQL】如何向mysql数据库插入当前时间
- python实现简单购物系统优化版
- Mysql的安全配置向导命令mysql_secure_installation
- 基于Python(Django)+MySQL 实现(Web)SQL智能检测系统的设计与实现【100010694】
- Python数据处理Tips数据的降维的Scikit-learn的14种实现方式
- 使用 Python 操作 MySQL 数据库
- Python智慧农业之将数据存储在表格中并从图表中获取见解,基于 Google 表格和 Neo4j 中维护伴随植物知识图谱(教程含源码)
- 转 Python 访问数据库(SQLite、MySQL、SQLAlchemy)
- python操作mysql数据库系列-操作MySql数据库(五)
- python操作mysql数据库系列-操作MySql数据库(三)
- 【转载】python的魔法方法———A Guide to Python's Magic Methods
- 递归遍历嵌套结构(多层List)中的元素 ------Python
- mysql远程连接 Host is not allowed to connect to this MySQL server
- 【Python分布式服务框架】python实现gRPC服务
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- 华为OD机试 - 环中最长子串(Python)
- 华为OD机试 - 跳格子(Python)
- 【Python】python扩展
- python中解决读写文件内容出现乱码问题,f.write
- Python 基础 之 python 中 进程、线程、协程对比 区别和联系
- Python 基础 之 python 协程知识点整理,并实现一个简单 gevent 的协程并发图片下载的应用
- python衍生特征
- 【MySQL】mysql更换root密码,全网唯一有用!
- python 安装 0x000007b错误解决及VC++ 安装第三方库报红
- [Python]python+yaml三行代码完成配置文件灵活读取与warning:YAMLLoadWarning处理