来源于: PKI&密码学 公众号 https://mp.weixin.qq.com/s/TvrOYn3XgmjTejzIsClmzQ

    很多人都知道密码明文存储在数据库不安全,一般都采用HASH进行运算之后,把HASH值存储在密码里,这样就安全了么?答案是否定的!我们先来看看HASH的特性,然后在看看安全性上哪里出了问题;

    HASH值特性:
    1)不可逆
    一段明文经过HASH运算之后得到HASH值,这个HASH值是不能够通过某种运算在运算回明文的;
    2)HASH值长度固定
    HASH运算之后的HASH值根据不同的算法长度是固定的,例如根据SHA1算法运算出来的HASH值是160个字节;MD5算法运算结果是128字节长度;——》这里不是字节。应该是比特位
    3)HASH运算结果不重复
    相同的明文产生相同的HASH值,不同的明文不能够产生想同的HASH值;

    1. 2个估计大家都能够理解,但是第3个大家有没有发现什么问题呢,原文也就是准备进行HASH的内容其实是一个无限值,而运算结果HASH值根据不同的算法长度是固定的;也就是说是一个有限值,一个无限值一个有限值,也就是肯定会存在不同的原文,结果是一样的,是这样的;如果原文不同,HASH值相同那我们就称为碰撞;现在MD5都说不安全了,为什么不安全了,其实就是通过不同的原文通过破解获取到相同的HASH值这个制造碰撞的可能性在增大;(有兴趣的可以看看山东大学王小云的事迹)。存在这种可能,但是目前为止MD5的碰撞破解可能性更大,在SHA1还是理论上的。但是这个并不是通过HASH运算进行密码存储的问题,那说HASH运算存储口令有问题,问题到底在哪里呢?好我们说说它真正的问题;<br /> 根据HASH运算的前两个特性,一个密码经过了HASH运算之后是固定的,一旦系统的用户存储的HASH值被获取了,从HASH值上也看不到密码,但是我可以通过HASH密码表进行比对,什么是HASH密码表呢,其实就是把常用的一些口令例如123456password1234abcd等等比较常用的口令先进行了HASH运算得到了一个表,拿这个表和获取到的HASH进行比对,一旦相同,那么也就知道了你的真实口令了。破解就是这么简单。那怎么办呢?有没有办法避免呢;当然有了,**口令进行HASH运算的时候加盐(salt)。**怎么加呢?<br /> 原来的数据都是这样在数据库保存的<br />用户名 HASH密码 <br />zhangsan 7C4A8D09C......(20字节SHA1)

    那现在就可以变成
    用户名 盐 HASH加盐密码
    zhangsan AHeg4!4 8100822……(20字节SHA1)

    加了一个盐的字段,这个字段干什么用呢,这个盐值就是一个随机数;越随机越好;现把用户密码123456进行HASH运算,得到HASH值H1,在把(H1+盐)再次进行HASH运算得到新的HASH值,把新的HASH值保存起来,这样之前的HASH密码表就失效了,为了安全性每个用户的盐都应该不一样的,但是可能还有人会说,数据库内容被人获取了,不是一样把密码表换一换不就知道了,当然了,但是由于每个盐都是随机的,所以加大了HASH密码表的内容,以前1000个常用密码经过HASH运算得到1000个数据的密码表,而经过了Salt的处理,还是1000个密码,则需要1000X1000条密码数据库了,难度一下增大了很多,另外如果还有更安全的,可以通过硬件安全设备进行运算得到盐然后在运算就更安全了。这里就不在赘述了!

    过几天准备给大家讲解RSA系列算法中常用的PKCS#1,PKCS#7,PKCS#10, PKCS11以及PKCS#12。当然如果大家有需要了解的内容也可以主动回复PKIPKI公众号说出大家关注点随时调整培训内容!