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都解密出來。但感受整個過程都記下來,但願對讀者有所幫助。