用户工具

站点工具


习科旧站:22位四不像的md5密码解密分析

22位四不像的md5密码解密分析

文末附解密工具

密码样本

等长22位密码,CMD5可识别

GCV15/bVem29Cu9CiBpP+w
GCV15/bVem29Cu9CiBpP+w
E5Ia47UWnXs19vyWWsjKbg
Q3GN6LRsX/ba1eJUEQqLeA
Dhvt8khDDmpERqXcsUhtWQ

这是前5条数据, 长度都是22字节, 等长 → 目测应该是某种hash;

了解下这种加密是怎么来的, 走个流程熟悉熟悉,用第三条数据当示范:

E5Ia47UWnXs19vyWWsjKbg
E5Ia47UWnXs19vyWWsjKbg==

密文长度为22, 22 mod 3 ≡ 1, 补俩=, 使其模3为0, 这就是base64;
不过有人会问, 长的像又不表示这就是base64,所以继续看看怎么把E5Ia47UWnXs19vyWWsjKbg还原成出来: 先列个表,等会要用

00A16Q32g48w
01B17R33h49x
02C18S34i50y
03D19T35j51z
04E20U36k520
05F21V37l531
06G22W38m542
07H23X39n553
08I24Y40o564
09J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

第一步把,E5Ia47UWnXs19vyWWsjKbg根据上面的表还原出来数值: 04 57 08 26 56 59 20 22 39 23 44 53 61 47 50 22
第二步,把04 57 08 26 56 59 20 22 39 23 44 53 61 47 50 22转成Bin值:

0400000100
5700111001
0800001000
2600011010
5600111000
5900111011
2000010100
2200010110
3900100111
2300010111
4400101100
5300110101
6100111101
4700101111
5000110010
2200010110
2200010110
4400101100
3500100011
1000001010
2700011011
3200100000

第三步,一共有22个, 前21个把开头的00去掉, 最后一个除了去掉开头的00还要去掉末尾的0000得到这个:

00010011 10010010 00011010 11100011 10110101 00010110 10011101 01111011 00110101 11110110 11111100 10010110 01011010 11001000 11001010 01101110

把Bin转换成Hex:

0001001113
1001001092
000110101A
11100011E3
10110101B5
0001011016
100111019D
011110117B
0011010135
11110110F6
11111100FC
1001011096
010110105A
11001000C8
11001010CA
011011106E

最后得到: 13921AE3B5169D7B35F6FC965AC8CA6E,这种MD5(d_Base64)的方式在asp.net的Membership中自带了

internal string EncodePassword(string pass, int passwordFormat, string salt)
{
    if (passwordFormat == 0)
    {
        return pass;
    }
    byte[] bytes = Encoding.Unicode.GetBytes(pass);
    byte[] src = Convert.FromBase64String(salt);
    byte[] dst = new byte[src.Length + bytes.Length];
    byte[] inArray = null;
    Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
    if (passwordFormat == 1)
    {
        HashAlgorithm algorithm = HashAlgorithm.Create(Membership.HashAlgorithmType);
        if ((algorithm == null) && Membership.IsHashAlgorithmFromMembershipConfig)
        {
            RuntimeConfig.GetAppConfig().Membership.ThrowHashAlgorithmException();
        }
        inArray = algorithm.ComputeHash(dst);
    }
    else
    {
        inArray = this.EncryptPassword(dst);
    }
    return Convert.ToBase64String(inArray);

主要思路是把密码字符串转换为字节数组存放,将salt(base64字符串)也转换为字节数组,将两者拼接着一个数组,然后对数组进行加密,当passwordformat为0时,返回原字符串,1或者其他的时候 则通过web.config中machinekey配置节中的Validation读取加密算法,可能算法是(MD5 SHA1 DES等)然后利用此加密算法对刚才的字符串进行加密,加密完后进行base64编码成字符串然后跟数据库中的密码进行比较,相同则登陆成功。如果数据中的salt值刚好为空时,还原回去的值才是原先的密码。

解密工具:d_Base64加密转32位MD5.exe

你需要登录发表评论。
习科旧站/22位四不像的md5密码解密分析.txt · 最后更改: 2020/05/16 19:19 (外部编辑)

页面工具