首页
社区
课程
招聘
[原创]唠一唠mysql的口令算法
发表于: 2010-3-10 23:36 15154

[原创]唠一唠mysql的口令算法

2010-3-10 23:36
15154
Author: kyo327
email: humour327#hotmail.com
Date: 2010-03-10

大家都知道mysql口令的加密分两种。一种是古董级别的mysql323加密,另一种是蒙骗了大众的的mysql sha1加密。
虽然现在遇到这样的加密可以用cain来破解,按说我不用在这里多此一举,但本文不是为了破解而写,只是科普一下,让大家更清楚的了解mysql口令的加密方法到底是怎样的。

先说mysql4.1.x版本以后的:
mysql> select password('kyo327');
+-------------------------------------------+
| password('kyo327') |
+-------------------------------------------+
| *B19CB640DF626A73397BFBBB8111D11E2BEC11F1 |
+-------------------------------------------+
1 row in set (0.02 sec)

mysql> select sha1('kyo327');
+------------------------------------------+
| sha1('kyo327') |
+------------------------------------------+
| d81e2a1a72f5a4f570b0f05baaa0cffc5d2d6820 |
+------------------------------------------+
1 row in set (0.03 sec)
  


很明显不是标准的sha1加密。然而这个问题像是皇帝的新装一样,好像没有哪个人指出来,那我就在这里当一次无知的小孩吧。 再看下面
  


mysql> select sha1(0xd81e2a1a72f5a4f570b0f05baaa0cffc5d2d6820);
+--------------------------------------------------+
| sha1(0xd81e2a1a72f5a4f570b0f05baaa0cffc5d2d6820) |
+--------------------------------------------------+
| b19cb640df626a73397bfbbb8111d11e2bec11f1 |
+--------------------------------------------------+
1 row in set (0.00 sec)
 


我想无需用过多言语,大家应该都很清楚mysql4.1.x以后版本的加密方式了吧。

接下来说一说mysql323加密。

这个我是直接从mysql源代码里抠出来的。代码如下:


#include "stdio.h"
#include <string.h>

void hash_password(long *result, const char *password, int password_len)
{
register long nr=1345345333L, add=7, nr2=0x12345671L;
long tmp;
const char *password_end= password + password_len;
for (; password < password_end; password++)
{
if (*password == ' ' || *password == '\t')
continue; /* skip space in password */
tmp= (long) (char) *password;
nr^= (((nr & 63)+add)*tmp)+ (nr << 8);
nr2+=(nr2 << 8) ^ nr;
add+=tmp;
}
result[0]=nr & (((long) 1L << 31) -1L); /* Don't use sign bit (str2int) */;
result[1]=nr2 & (((long) 1L << 31) -1L);
}

int main(int argc, char* argv[])
{
const char *password="kyo";
long hash_res[2];
hash_password(hash_res, password, (int) strlen(password));
printf("%08lx%08lx\n", hash_res[0], hash_res[1]);
return 0;
}
 


运行后
7901b47128d1045d
mysql> select old_password('kyo');
+---------------------+
| old_password('kyo') |
+---------------------+
| 7901b47128d1045d |
+---------------------+
1 row in set (0.00 sec)
 


over。
想做mysql密码爆力破解工具的,根据本文应该很容易写出来了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (13)
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
2
good good .....学习一下
2010-3-11 10:44
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
3
来学习一下,谢谢share!
2010-3-11 11:51
0
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
貌似SHA-1还是有些问题的,有人在上面做过文章,只是不知道现在最新的进展怎么了。
2010-3-11 13:24
0
雪    币: 145
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
也来支持下吧,前段时间才开始用MYSQL,这都有爆破了,看来落伍了啊
2010-3-11 14:28
0
雪    币: 15
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
额 我看不懂哦。。。
2010-3-11 17:37
0
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这次看懂了,第一次来没有细看,谢谢
2010-4-1 23:29
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢楼主分享
2010-4-3 12:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
真是不错的算法的,学习
2010-4-6 20:32
0
雪    币: 2190
活跃值: (981)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10

这个给出了算法
给我加密了的密文也逆不出来啊
2010-4-7 08:47
0
雪    币: 288
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
如何验证密码的正确性,怎样的认证过程?根据我抓的包,应是这样的过程,不知正确与否,恳请大侠指正:

采用CHAP认证协议,客户端提出认证请求后,服务器发送欢迎(greeting)包,包含版本号、处理此请求的线程ID以及scramble(scramble即是挑战值,ethereal把它解析为盐salt),客户端根据scramble对用户的口令进行散列,生成登录包发给服务器。服务器收到包后,根据用户名取出口令,使用scramble对口令散列,并与客户端提供的包比较,如一致,则向客户端发送OK包,这样就完成了一次认证过程,之后用户就可以使用SQL进行操作了。由于scramble每次登录都不相同,生成的登录包也就不同,所以可以抵抗重放攻击。
上传的附件:
2010-6-4 14:33
0
雪    币: 1731
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
牛啊!呵呵!学习下!需要现在看不懂!留个脚步下次看!
2010-6-12 01:48
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
没有看明白,楼主,您的这篇文章怎么用啊?
2012-4-25 16:01
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
来学习一下了,谢谢
2012-5-22 00:03
0
游客
登录 | 注册 方可回帖
返回
//