不管是MD5还是SHA,这一切的根本都是哈希算法,即单向函数
MD5
全称为 消息摘要算法版本5 (Message Digest Algorithm 5)
首先我要强调的是,MD5并不是加密算法,它是一种哈希散列算法。
但是其往往可以应用于信息安全方面。
MD5其实就是把一串不定长的信息变为定长的信息,实际应用中MD5的值是128bit,也就是任何长度的信息经过MD5的哈希算法最终都会变为128bit的数据。这点与CRC是类似的。
例如我以奇偶检验的方式作为哈希算法进行hash:
我由原始数据进行分组散列计算一定能得到最终MD5值0000011,但是我给你最终的MD5值你却无法得到我的原始数据,因为这样的分组组合太多了,这只是MD5的一个思想示例,实际的hash算法一定复杂的多,并且可以很好的解决冲突问题;所以MD5 的特点:
MD5特点:
1.不可逆性 — 根据 MD5 值计算不出原始数据
2.唯一性 — 不同原始数据会有不同的 MD5 值 (不完全可靠,后面说)
MD5用途:
数据完整性校验、数字签名、文件完整性检查、密码保存等等,
大型网站往往需要保存千万条用户密码,如果明文保存就非常扯淡了,如果用一般人看不懂的MD5值保存,即使服务端数据库被黑客攻破了黑客也无法复原出原始的用户密码,所以即使是网站本身的开发人员也无法知道你的密码;在Linux 系统中,用户密码都是以 MD5 形式存在文件中的,这样你在输入密码的时候,计算机只要计算你输入密码的 MD5 再跟计算机文件中存储的 MD5 进行比对就行了。
MD5具体算法:
1.填充数据,将原始数据填充为512bit的整数倍
2.循环计算,每512作为一组,前一组计算出的MD5的值(128bit)作为下一组MD5的幻数填充(即填充到起始位置)继续进行MD5运算,就这样n轮过后得到最终MD5值
彩虹表
这里MD5的长度是128bit,以十六进制保存,即有128^16中哈希值,更不要说是原始数据的可能性了,即使你排列组合出了所有原始数据的可能性,想要暴力破解出我都觉得用全世界最先进的那几台计算机也得算很久。但是思想是一样的,想要登录进你的账户黑客一定得知道你的原始明文密码,实际上黑客是希望你能去选择安全性弱的密码如123456,这样这种常规的组合密码字符就可以在公开的彩虹表中找到,彩虹表即包括了常用的明文组合以及其哈希值,黑客拿到你的哈希值就可以很快在其中检索到与之对应的明文密码
而彩虹表的构建十分复杂,有时间和必要的话我再去详细了解学习吧,其大概过程是这样的:拿一个明文字符,定义一个R函数,必须是定义域和值域与H函数相反
第一步:先根据明文计算出其哈希值,此过程称为H函数,这个过程你可以去要破解的网站本身去注册拿到其哈希值;
第二步:取计算出的hash值的前n(比如 n为 8)位得到新的字符串,将新的字符串作为明文,此过程称为R函数
第三步:再次重复上面两步。
加盐
但是无论如何,你只要知道黑客通过各种途径如果拥有相应哈希算法的彩虹表那么就很容易破解常规的字符组合密码,况且普通人似乎都是常规的密码,尤其是老一辈人很早之前喜欢用手机号,生日等作为密码;
所谓的加盐就是在原始密码哈希化之前再加入参数,比如说将用户名加在前面然后一起再进行哈希化,不同的公司加盐策略是不同的,但是相对于黑客的彩虹表来说肯定是极大可能找不到的,因为彩虹表的生成也是有规律,比如黑客会根据自己的调查,以你的手机号、生日、爱好、伴侣名等信息去生成相应词汇组合,对于加盐的字符命中几率会更低;另外提高哈希函数的难度以及MD5迭代次数都可以大大提高破解难度,彩虹表是通过不断迭代哈希函数H与自定义哈希R去生成的表的,如果单次H函数都需要消耗很大的计算机资源,那么不停的迭代黑客的设备也顶不住的。
SHA
SHA与MD5其实是差不多的,无非就是哈希函数不同,幻数段数已经迭代方式,迭代次数不同,以及最终的摘要长度不同,如果有特别的点我以后再继续补充吧。