为什么使用加密盐

什么是加密盐?

百度给出的解释是:加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联。

无论何时只要口令改变,随机数就改变。

随机数以未加密的方式存放在口令文件中,这样每个人都可以读。

不再只是保存加密过的口令,而是先将口令和随机数连接起来然后一同加密,加密后的结果放在口令文件中。

ps:这里的口令应该指的是password

加密盐的意义何在?

由于相同的密码经过哈希之后的密文是相同的,当存储用户密码的数据库泄露后,攻击者会很容易便能找到相同密码的用户,从而降低了破解密码的难度。因此,在对用户密码进行加密时,需要考虑对密码进行掩饰,即使是相同的密码,也应该要保存为不同的密文,即使用户输入的是弱密码,也需要考虑进行增强,从而增加密码被攻破的难度,而使用带盐的加密hash值便能满足该需求。

加密盐实现方式

可以将 salt 放到 passWord 前面作为前缀或放到 passWord 后面作为后缀得到新的字符串PS,即 PS = password 和 salt 的组合串;

密码密文passWordHash = Hash加密函数(PS );

将用户名、密码密文 passWordHash 和盐值 salt 一起保存到数据库中。

这样,因为salt 是随机生成的,所以就算两个完全相同的password所产生的salt也是不同的。

密码校验

从数据库中取出当前用户密码当初加密时使用的盐值salt

得到本次输入的密码passWordCur和盐值salt的组合字符串PS

得出本次输入密码的密文passWordHashCur= Hash加密函数(PS)

比较 passWordHashCur 和用户最初设置的密码密文 passWordHash 是否一致,如果一致,则校验成功,否则校验失败。

常用的密码攻击方式

常用的密码攻击方式有字典攻击、暴力破解、查表法、反向查表法、彩虹表等。

对字典攻击和暴力破解,攻击者均采用逐密码尝试的方式,目前没有很好的手段来阻止字典攻击和暴力破解攻击,只能是想办法让这两种攻击方式变得相对低效一些,而相同的密码产生不同的hash值便能让攻击者针对每一个hash值都需要从头进行尝试,从而使攻击变得更加低效。

对查表法、反向查表法和彩虹表攻击方式,攻击者需要提前准备好包含密码和密码hash值的密码表,然后根据该表和用户密码数据库进行批量匹配,从而达到攻破密码的目的;而如果我们在加密时,给每个密码附加了不同的随机值,这样每个密码对应的hash值也会不同,这样攻击者在准备密码表时,就必须要将最基本的密码和用户密码数据库中的盐值进行笛卡尔积后再计算hash值,盐值越多,攻击者需要准备的表量越大,这样对于攻击而言,就变得有些得不偿失了

由此可见,如果想要完全杜绝密码破解是不可能的,但是通过加盐可以使得(password+salt)的长度变长,这样攻击者需要准备的表量越大,当表特别大的时候,攻击者在有限的时间内无法破解,而得不偿失。其实好多加密的方法的本质就是复杂化,目的只是阻止,而无法做到真正的杜绝。

使用加密盐的注意事项

加盐的目的是为了增加攻击者破解的难度,那么在加盐的时候要注意以下几点,否则加盐的意义也不会太大。

盐值不能太短。如果盐值只有少数两三位甚至一两位的话,攻击者完全可以穷举所有可能的盐值;关于盐值长度的一个经验值是长度至少要和hash加密函数的返回值长度保持一致。

盐值不能固定。如果系统使用了固定的盐值,那么和不加盐相当于是一回事了,攻击者完全可以使用该固定的盐值提前准备密码表;另外,相同密码对应的hash值仍然是一样的,仍然无法对密码相同这一事实进行掩饰。

不要使用能提前预知的值作为盐值。如果盐值能提前得知或提前推断出,攻击者也完全可以根据提前预知的盐值准备密码表,从而对破解的难度也增加不了多少。

每一次修改密码重新计算hash值时,要重新生成新的盐值,不要使用上次密码对应的盐值。因为如果用户密码泄露之后,盐值相应的也就泄露了,用户修改密码时,如果还沿用原来的盐值,攻击者也仍然可以根据上次的盐值提前准备密码表,从而使攻破可能性变得更高了。

你可能感兴趣的:(计算机网络,hash,安全,信息安全,加密解密)