0x00 原由:javascript
网上看帖子的时候有人推荐了一个基于GPU的MD5解密软件Barswf,帖子说解密速度很快,无聊就荡了一份下来试验了一下。(分享一下软件:连接: http://pan.baidu.com/s/1jGVZruQ 密码: 8eay,这是个64的windows版本)试了一下对于8位及一下的MD5加密解密速度仍是很快的,用本身的渣渣电脑也能跑到1700Mhash/s,一个8位的 小写字母加数字的MD5很快就能跑出来。html
使用语法规则以下:java
-h 5216b5ad6cd0c6265bfa11c19e93ee18-c 0aA~ 设置密文可能包含的字符串类型0 表示纯数字例如:1234567890a 表示纯字母例如:abcdefghigklmnopqrstuvwxyzA 表示大写字母~ 表示可打印的特殊字符example:barswf_cuda_x64.exe -h 350c9d901b7f1c73a481e240ec1b7c0b -c a(纯小写) barswf_cuda_x64.exe -h 30e0ae2b52f3ff74f2de65a4573164f8 -c 0aA(大小写和数字混合)ajax
后来查了一下破解hash密码的有一个更专业的工具:hashcat,并且最近也开源了。也试了一下,惟一的好处是hashcat纯靠GPU,不像这个同样每次跑cpu都是满负荷的运转,渣渣本子扛不住。并且hashcat支持字典,以及其余各类形式的hash加密。总之就是hashcat更专业。有兴趣的同窗能够本身查一下。我就不在这详细描述了。数据库
回到正题,有了这个工具就想折腾点什么,因此想到了曾经被脱裤的那些网站的数据。而后就在网上找了一些数据库。比较感兴趣的就是小米论坛的库(原来也用太小米的手机,想找找本身的数据被泄密没)。json
简单一看密码后面跟了一个6位的数字,明显是加盐了。看来小米仍是比较良心的,不像csdn那样的明文数据库。(注:研究这些只是兴趣,并没有恶意,小米官方也就数据库泄露作了说明,全部泄露的数据的用户都已经被强制要求修改修改密码了,因此这些数据作作研究就行了,想干坏事仍是省省吧)windows
对于这种加盐的密码要想还原回去,首先得知道加盐的方式,并且加盐以后密码的长度最短也须要12位吧,原本想用本身电脑解密的,但一想一条都到猴年马月了,直接到cmd5网站解密,结果提示找到结果但要收费,收费就收费吧,准备充值的,但一看100起充,瞬间就放弃了。因而就寻找别的破解网站吧。最后发现了一个chaMD5的良心网站,注册以后能够免费查,就拿第一条为例吧cookie
密文:201e4a5117cf97f1ba83984c68a611d2:109027app
解密以后的明文:bcbe3365e6ac95ea2c0343a2395834dd109027 工具
能够看到盐值是直接追加到后面的,并且前面明显是通过MD5加密的,因此对前面一部分再次MD5解密
BCBE3365E6AC95EA2C0343A2395834DD : 222
解密出来明文是 222
既然知道加密方式了就想把全部的都解密出来玩玩啦。一条一条的解密?开什么玩笑,几百万弄死你也搞不完,因此咱们须要一个自动查询的程序,来解决手工查询的烦恼。
0x01 urlib2 && requests
chaMD5不须要验证码就能登陆,因此只须要登陆上去,得到cookie,而后每次查询的时候加上cookie就能查到结果。
首先提交查询确定是post请求,只要模仿网页中的post请求的格式替换其中的查询的加密的字符串就能获得查询结果。直接用wrieshark抓取post请求的数据包。由于只是用本身的帐号查询,因此就不用再去用cookiejar去获取cookie,直接把数据包中的cookie复制出来,而后替换其中cookie段便可。用来模拟post请求的话urllib2确定是最简单的。根据上述思路写好代码:
import urllib2
import cookielib
import json
#cookies = cookielib.CookieJar()
#opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies))
#urllib2.install_opener(opener)
#req = urllib2.urlopen('http://www.chamd5.org/login.html')
#print req.read()
#f = opener.open('http://www.chamd5.org/HttpProxyAccess.aspx/ajax_login')
#f = opener.open('http://www.chamd5.org/login.html',)
data = "{'hash': '201e4a5117cf97f1ba83984c68a611d2','type': 'md5'}"
url = 'http://www.chamd5.org//HttpProxyAccess.aspx/ajax_me1ody'
headers = {'Host': 'www.chamd5.org',
'Connection': 'keep-alive',
'Content-Length': '58',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Origin': 'http://www.chamd5.org',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'Content-Type': 'application/json; charset=UTF-8',
'Referer': 'http://www.chamd5.org/login.html',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Cookie':'***********'
}
#f = opener.open('http://www.chamd5.org/login.html',headers)
request = urllib2.Request(url,data,headers)
r = urllib2.urlopen(request)
html = r.read();
print html
print type(html)
s = list(html)
print len(s)
for line in range(286):
s[line].encode("utf-8")
#print line
print "end"
可是这种方法并不行,由于返回值是json对象,没法解析。为此纠结了2天,后来在网上找到有大神说requests更好用,因此改用requests。
代码以下:
import urllib2
import cookielib
import json
#cookies = cookielib.CookieJar()
#opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies))
#urllib2.install_opener(opener)
#req = urllib2.urlopen('http://www.chamd5.org/login.html')
#print req.read()
#f = opener.open('http://www.chamd5.org/HttpProxyAccess.aspx/ajax_login')
#f = opener.open('http://www.chamd5.org/login.html',)
data = "{'hash': '201e4a5117cf97f1ba83984c68a611d2','type': 'md5'}"
url = 'http://www.chamd5.org//HttpProxyAccess.aspx/ajax_me1ody'
headers = {'Host': 'www.chamd5.org',
'Connection': 'keep-alive',
'Content-Length': '58',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Origin': 'http://www.chamd5.org',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'Content-Type': 'application/json; charset=UTF-8',
'Referer': 'http://www.chamd5.org/login.html',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Cookie':' ***********'}
#f = opener.open('http://www.chamd5.org/login.html',headers)
request = urllib2.Request(url,data,headers)
r = urllib2.urlopen(request)
html = r.read();
print html
print type(html)
s = list(html)
print len(s)
for line in range(286):
s[line].encode("utf-8")
#print line
print "end"
0x02 总结
虽然最后由于网站查询MD5须要消耗积分值,因此并不能把全部的MD5都解密出来。但感受整个过程都记下来,但愿对读者有所帮助。