先甩个百度百科的链接
https://baike.baidu.com/item/MD5/212708
简介
MD5是一种信息摘要算法,不可反向解密。不管原文是什么,最后得到的密文长度都为32个16进制字符,不区分大小写。
特点是:
1、原文即使改动很小,密文就会发生巨大变化,“面目全非”,毫无规律。
2、原文长度没有要求,密文的长度固定,32个16进制字符。
3、相同的原文,生成相同的密文。
4、不同的原文,大概率得到不同的密文,极小概率得到相同的密文。因为密文由32个16进制字符组成,可能性组合就是16的32次方,密文的可能性是有限的,而原文可能性无限多,无限对应有限,必定会出现碰撞。
5、原文区分大小写,密文不区分大小写。
原文:123456,MD5密文:E10ADC3949BA59ABBE56E057F20F883E
原文:123457,MD5密文:F1887D3F9E6EE7A32FE5E76F4AB80D63
编码问题
在计算MD5时,原文会先转换成byte,有可能会产生编码问题。
以GB2312和UTF-8编码为例。特别是中文,用GB2312和UTF-8编码分别转换成byte,结果不一样。
所以在编写代码时,各处使用的MD5算法,应该使用相同的编码,否则可能导致相同的原文,产生不同的密文。
使用
MD5是不能进行常规的反向解密,使用时一般比较密文,如果密文一样,则认为原文一样,不需要知道原文到底是什么。
虽然存在碰撞的可能性,不同的原文,它们的密文相同,但是实际使用中因为概率低,在非极端安全要求的情况下,不考虑这种情况。
使用密文比对,数据库不会保存原文。因为密文无法反向解密,所以除了用户,即使系统管理员也无法知道用户的密码原文。
不可逆原因
原因很简单,因为MD5是一种摘要算法,所谓摘要,就是会有一些信息丢失,无法得知丢失的信息,也就无法逆运算。
比如,120,121,122去掉最后一位数字,结果都是12,没有办法知道去掉的到底是什么数字。
暴破
既然MD5无法逆运算,那为什么网上还有MD5破解?其实不是真正意义上的破解。
一、暴力破解
如果知道原文是00-99的纯数字,那就把00-99所有的可能数字都算出MD5,一个个进行比对。
二、字典破解
网上有一些MD5的字典库,就是原文和密文的对应表,但是数据量很大,上万亿级别,如果你的密文正好在字典库里,一查对应表就行。
其实不管用什么加密算法,密码长度都是影响安全的重要因素。只要你原文长度够长,够复杂,暴力破解和字典破解成功的概率几乎为0。
(按现在的民用计算机的计算能力,当密码到一定长度,这辈子都无法完成暴破。当然说不定以后会普及超级计算机,这就不讨论了)
防御
对比破解手段,防御手段相对简单,并且高效。
1、不要在别人的网站上计算md5。有的在线md5加密网站,你用了,会把你的原文和密文保存到他的字典中,然后向别人提供收费字典破解服务。这一条最重要!
2、增加原文长度。
防暴破:原文到一定长度,暴破已经不太可能。假设原文是12位数字和小写英文的组合,原文的可能性就有36的12次方。假设每秒计算500万次,把所有的可能性都试一遍,大概需要3万年。
防字典破解:字典破解也会因为原文长度增加而失败。字典中的数据来源有2种方式,1是用户手动加密的时候存入,比如上面一条红色注意点,2是服务器不间断遍历字符串,不间断生成原文和密文。但是限于计算机的计算能力,需要很长的时间才能遍历到长度较长的字符串。所以只要原文长度够长,字典中肯定不会有你的数据。字典中唯一可能存在的是相同的密文,但是肯定无法匹配到相同的原文。
3、加密时加入【salt】,也可以叫,加盐值、紊乱字符串、随机字符串。原来加密方式是原文直接生成密文,加盐是先把原文加上一个字符串再生成密文。这样做的好处有2个。
①增加原文长度和生僻度,增加破解难度。123456在字典中有数据,一下就被破解,但是多加一个盐,123456ABC,可能字典中就没有了。
②安全隔离不同的客户或应用。A客户,B客户,使用不同的salt,那即使算法完全一样,生成的密文也是不一样的。举个不恰当的例子,A客户破解了软件和算法,想用相同的算法伪造一条B客户的数据,但是会发现不知道B客户的salt,无法生成在B客户那边有效的数据。
salt示例:
输入相同的原文【123456】
直接md5加密:结果 → MD5(123456)= E10ADC3949BA59ABBE56E057F20F883E
A客户 salt = AAA:结果 → MD5(123456AAA)= 5DEC5DBF7FE7A7163626B0A63CAEA3AB
B客户 salt = BBB:结果 → MD5(123456BBB)= F1E4078CA30ED7AED04E1462E6AB0740
可以发现,相同的原文,A客户和B客户的密文不一样。只要salt保密,算法即使公开,也无法伪造数据。
salt和原文的拼接方式可以自定义。
4、二次摘要,就是对生成的密文再做一次处理。可以再一次MD5,也可以做位移,丢弃,等等,当然也可以做三次、四次、五次……摘要。
输入相同的原文【123456】
直接md5加密:结果 → MD5(123456)= E10ADC3949BA59ABBE56E057F20F883E
二次md5(做2遍md5):结果 → MD5(E10ADC3949BA59ABBE56E057F20F883E)= F59BD65F7EDAFB087A81D4DCA06C4910
丢弃(丢弃16个字符):结果 → E10ADC3949BA59AB
丢弃后加入随机字符串:结果 → E10ADC3949BA59ABF59BD65F7EDAFB05(其实后加的16个字符毫无意义,是随便加的)
这么做也有2个好处,极大增加暴破和字典破解难度,极大的迷惑性。丢弃法会让人想不到是md5,加入随机串会让无意义的内容干扰破解,在不知道算法的情况下,基本无从下手。二次摘要的方法还有很多,不一一列举了。
基本上防御手段很高效,能破解的都是弱密码,懒程序员。。。
THE END
欢乐的时光特别快,又到时候讲拜拜~
有错漏可以留言指出,谢谢支持。