首先从md5提及,通常新进入开发行业最早接触的就是md5了,
md5本质上是一个hash(谐音:哈希)算法,能够从一个大文件信息中提取出一小段信息,叫提取摘要,
有的地方也有提取指纹这种说法,其实指纹这个比喻很好,算法
md5(原始数据) = 摘要安全
hash算法的目的:一样的一段数据经过hash函数老是获得相同的摘要,不一样的数据经过md5老是应该
获得不一样的摘要函数
为何须要摘要:
一个很常见的使用场景是在会员系统上,网站为了安全通常不会存储用户的登录密码,
那为咱们在登录的时候网站怎么知道咱们的密码是对的呢?答案就是hash,好比你在
注册的时候密码填写的 123456,系统将你的密码进行hash,最后的结果多是
e10adc3949ba59abbe56e057f20f883e,会员系统就是存的这一串字符,当你下次
登录的时候,你输入123456,系统仍是用原来那套hash算法,得出一串字符,和系统以前存
的字符串对比,若是同样,说明密码正确。网站
hash算法目的那一行有一个关键词“应该”,hash的目的是理想化的,无论什么hash算法实际
上总有特别小的几率会出现不一样的原始数据经过hash函数可能会获得相同的结果,
因此:越好的hash算法会将这个几率降到越低
这个几率越低,黑客要经过手段碰撞出相同摘要的难度就越大
常见的md5他的安全性其实不高,黑客很容易就能够利用彩虹表进行md5碰撞来生成相同的摘要,加密
因此如今市面上的系统在使用md5的时候一般会有加盐操做,spa
md5(原始数据+salt) = 摘要md5
由于混入了salt,安全性进一步获得提高开发
细心的读者可能发现了,我上面一直说的摘要和哈希,并无提到加密,那么md5属不属于加密呢?字符串
由md5+salt 继续延伸一下其实就是 HS256 (Hmac + Sha256)
sha256和md5的功能同样,可是比md5更加安全hash
HS256(原始数据,key) = 摘要
这里的key就和salt做用相同
一样的问题,HS256属于加密吗?
答案是: 否,上面的都不属于加密,而是摘要,或者说指纹
什么叫加密,一个数据经过一个算法加密,能够经过相反的算法解密,而摘要只能单方向的的’加密‘,不能逆向解密,因此不属于加密,可是摘要在某些状况下确实有加密的效果,并且摘要和加密一般紧密结合,好比要对一个大文件进行加密,可是这些加密函数都不支持这么大的文件,怎么办?这个时候就须要用hash函数先提取摘要,在对摘要进行加密来达到一样的效果