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.推荐一个解密完整,收录了一些简单的解密记录
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