MD5消息摘要算法,回顾课堂特此记录

1. 简单测试

    @Test
    void MD5Info(){
        String rawPassword = "123456";
        String EncodePassword = DigestUtils.md5DigestAsHex(rawPassword.getBytes());
        System.out.println("原文:" + rawPassword);
        System.out.println("密文:" + EncodePassword);
    }

原文:123456
密文:e10adc3949ba59abbe56e057f20f883e

2. 只要使用相同的摘要算法,得到的密文长度都是相同,所以可能产生不同的原文得到相同的密文

3.如果算法的计算结果长度是固定的,会根据结果是多少位二进制数组成来确定是多少位算法,以MD5为例,其计算结果是由128个二进制数组成的,所有MD5算法是128位算法,通常,会将二进制结果转成十六进制来表示,所有,会是32位长度的十六进制数

4.密文的组成

由 0 ~ 9 和 a ~ f 组成

 5.常见算法的位数

MD系列(MD2,MD4,MD5)都是128位算法

SHA-1是160位算法, SHA-256是256位算法, SHA-384是384位算法, SHA-512是512位算法

 以SHA-256为例 是由 256 个二进制组成的,转为十六进制 需要除以 4 得到 64位 由 0 ~ 9 或 a ~ f 字符组成 

6.理论上说,如果某个算法的结果只有 1 位,(1个二进制, 0 / 1),最多使用2 +1个不同的原文,必然发生 "碰撞"  

a1 => 1

a2 => 0

a3 => ?

 如果算法的结果有 2 位,最多使用 4 + 1 个不同的原文必然发生碰撞

b1 => 00

b2 => 01

b3 => 11

b4 => 10

b5 => ??

 如果算法的结果有 3 位 ,最多使用 8 + 1 个不同的原文必然发生碰撞

c1 => 000

c2 => 100

c3 => 110

c4 => 111

c5 => 010

c6 => 001

c7 => 011

c8 => 101

c9 => ???

 而MD5是128位算法,理论上,最多需要使用2的128次方 + 1个不同的原文才能保证必然发生碰撞

2的128次方的值是:340282366920938463463374607431768211456

要尝试的次数太多,按照目前的计算机的算力,这是不可能实现的!所以,大致可以视为“找不到2个不同的原文对应相同的结果”。 

7. 对于使用消息摘要算法处理密码加密的结果,如果需要破解,只能尽可能的穷举原密码(消息/原文)与加密后的密码(摘要/密文)之间的对应关系,当执行“破解”时,从记录下来的结果中进行搜索即可

8.推荐一个解密完整,收录了一些简单的解密记录

md5在线解密、加密工具 - cmd5.la 

9.加盐

    @Test
    void MD5Info2(){
        String salt = "i;asl;dasljdaasfgasfdas";
        String rawPassword = "123456";
        String EncodePassword = DigestUtils.md5DigestAsHex((rawPassword + salt).getBytes());
        System.out.println("原文:" + rawPassword);
        System.out.println("密文:" + EncodePassword);
    }

原文:123456
密文:f7e6f1fd9a2fdde83c0a1785567fc1b5

你可能感兴趣的:(MD5)