盐值加密

在[[程序设计]]方面,密码等信息的加密很重要,已经有一些现成的方案来加密存储了。加密盐可以看作是用其他信息去干扰密码加密结果,从而加大破解难度。

加密盐的实现方法

加密存储

  • 输入: 密码字符串passWord

  • 输出:盐值 salt 、密码密文passWordHash

  • 函数:加密hash函数

  • 其中:“盐值 salt”是在加密过程中生成的随机字符串;

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

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

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

密码校验

输入:密码字符串password

输出:密码校验是否成功

处理:

  1. 取出当前用户密码加密时使用的盐值salt

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

  3. 得出本次输入密码的密文passwordHash= Hash加密函数(PS );

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

注意事项

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

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

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

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

作者

xeonds

发布于

2021-07-19

更新于

2024-05-13

许可协议

评论