2021.07.19 00:14:15
在[[程序设计]]方面,密码等信息的加密很重要,已经有一些现成的方案来加密存储了。加密盐可以看作是用其他信息去干扰密码加密结果,从而加大破解难度。
输入: 密码字符串passWord
输出:盐值 salt 、密码密文passWordHash
函数:加密hash函数
其中:“盐值 salt”是在加密过程中生成的随机字符串;
可以将salt放到passWord前面作为前缀或放到passWord后面作为后缀得到新的字符串PS,即,PS = password和salt的组合串;
密码密文passWordHash = Hash加密函数(PS );
将用户名、密码密文passWordHash和盐值salt一起保存到数据库中。
输入:密码字符串password
输出:密码校验是否成功
处理:
取出当前用户密码加密时使用的盐值salt
得到本次输入的密码password和盐值salt的组合字符串PS
得出本次输入密码的密文passwordHash= Hash加密函数(PS );
比较passwordHash和用户最初设置的密码密文password是否一致,如果一致,则校验成功,否则校验失败。
盐值不能太短;如果盐值只有少数两三位甚至一两位的话,攻击者完全可以穷举所有可能的盐值;关于盐值长度的一个经验值是长度至少要和hash加密函数的返回值长度保持一致。
盐值不能固定;如果系统使用了固定的盐值,那么和不加盐相当于是一回事了,攻击者完全可以使用该固定的盐值提前准备密码表;另外,相同密码对应的hash值仍然是一样的,仍然无法对密码相同这一事实进行掩饰。
不要使用能提前预知的值作为盐值;如果盐值能提前得知或提前推断出,攻击者也完全可以根据提前预知的盐值准备密码表,从而对破解的难度也增加不了多少。
每一次修改密码重新计算hash值时,要重新生成新的盐值,不要使用上次密码对应的盐值;因为如果用户密码泄露之后,盐值相应的也就泄露了,用户修改密码时,如果还沿用原来的盐值,攻击者也仍然可以根据上次的盐值提前准备密码表,从而使攻破可能性变得更高了。