简述:
最近在研究系统以及驱动,当下载比较大的文件时总会提供SHA1或者SHA256,下载结束后使用校验工具得到的值与它进行比对来判断下载是否成功。
使用工具校验
certutil -hashfile 文件名 sha1/sha256/md5
正文:
MD5、SHA1、SHA256这些都被称为 哈希函数或散列函数。这些算法的最大的特点是不可逆。也就是不能从结果值去推演出初始值。
运算过程:
这里举个简单例子来讲解一下为什么不可逆。假如我们要对 1234567890 这串字符进行哈希运算。
-
只取偶数位的值: 既得到 24680
-
对每个数字都进行+1, 得到 35791
-
然后只截取前面三位数字: 得到 357
从这个简单的运算后得到 357 的结果,很明显是不可能反推出我们初始值 1234567890 的(不可逆)
可以肯定的是按照这个运算过程 1234567890 得出的结果一定是 357。(结果位数固定)
但应该很多人都发现了一个问题,我只要保证前面三个偶数位的值是246,其他随便怎么变。它最终的结果都是357。
没错!!!
哈希函数都有这个特点,对不同的数据加密,一定会有产生相同结果的值,这个也被称为碰撞。
我们可以输入的数据是无穷的(不管图片、视频、文件、各种字符…在计算机里无非都是0和1罢了),而用几十位数值作为输出,那肯定是会有重复的结果。
对于我上面模拟的哈希函数,那碰撞性可就太大了。那么优化一下,我在第三步截取改为前面5位数字,那么碰撞性是不是变小了?
差异:
这也算是MD5、SHA1、SHA256之间最大的差别:
-
MD5的长度为(128 bit) 32个十六进制值
-
SHA1的长度为(160 bit) 40个十六进制值
-
SHA256的长度为(256 bit) 64个十六进制值
拓展:(4bit=1hex十六进制值,8bit=1Byte)
安全性: SHA256 > SHA1 > MD5
计算速度: MD5 > SHA1 > SHA256
当然它们的加密过程肯定是不一样,不然怎么可能产生不同的结果呢。不过总得来说它们三者的加密过程还是很相似的,换汤不换药。
哈希加密的运用场景:
1.存储用户密码
假设我们用某个软件,储存密码的时候都是明文。那么如果该软件的数据库被黑客入侵了或者有内鬼(终止交易)。那么我们的账号密码不是直接就暴露了?但是用了哈希加密就不一样。因为这个哈希值是不可逆的,即使密码被泄露,也不用担心我们实际的密码被人知道。
2.文件校验
下载某xx文件,假如服务器在国外速度特别慢,我们可能去找国内的一些网站下载。这有个风险,你怎么知道文件有没有被修改过?是不是加了个病毒木马?这里就可以用哈希值去校验,如果官网提供的值跟你运算出来的一样,则没有被修改过。
…(太多自己发挥想象力)
常见问题:
1.为什么有些网站可以解密MD5值?
实际上这并不是真正意义上的解密,而是把大家常用的语句、密码进行MD5加密把结果存储在数据库里。当你拿个MD5值去解密的时候,它就会去找数据库看看有没有这个值。如果有就给你返回结果,如果没有就解密失败。直白点说,你设置的密码太弱鸡了。
2.什么是加盐?
我的密码就爱设置为123456,怎么滴。不能为难用户,那就为难程序员。在MD5上加些其他的运算过程,比如得到最终结果的MD5以后,我把所有的A替换成F,1替换成9。那即使密码泄露了。因为不是最原始的MD5,即使是弱口令,不知道替换规则,那么也是破解不出来的。这种行为就被称为加盐。