1.PSS 中的盐值
之前我们聊过使用 RSA 进行签名时有两种填充方式:PKCS1v15 和 PSS。
链接如下:
密码学基础 -- RSASSA-PSS 盐值长度大揭秘
密码学基础--RSA 签名,你该选什么填充模式?
为什么 RSA 公钥加密结果不是固定值?
经过理论和实践分析下来,PKCS1v15 的签名结果总是固定值;而 PSS 填充方式因为有盐值(Salt)的加入,签名值就很随机。
因此在 Cryptography 库中明确提到:
PSS
is the recommended choice for any new protocols or applications, PKCS1v15
should only be used to support legacy protocols.
那为什么这个盐值会影响签名值?
我们还是从 PSS 填充方式开始说起,流程如下:
原始数据 M 经过 Hash 计算得到 mHash,接下来一步就是要对这个 mHash 进行填充并再做 Hash 作为 EM 的一部分即 H,在构建 M*时就利用到了 Salt。
根据 RFC3447 描述,Salt 是一段随机生成的数据,因此让 M*变得更加不可预测,这样再次通过 Hash 计算出来的 Hash 值就会更加随机,从而在某种程度上让签名变得不可预测。
2.密码中的盐值
基于上述理论,可以总结,加盐的目的用来增强 Hash,这在密码存储领域显得尤为重要。
还记得最开始学 C 语言,要求设计一个用户登录系统吗?
最开始没有任何密码学基础知识,设计出来的用户数据库必定长成这样:
这种数据库一旦泄露,那么所有用户名和密码都会被泄露。
老师告诉说你可以利用 Hash 算法的抗碰撞来增强安全性,因此优化后的用户数据库长这样:
我不存密码了,存放的是密码经过某 Hash 函数计算得到的 Hash 值。用户登录时输入密码,后台对这个密码执行相同 Hash 函数,和数据库中的 Hash 值比对,这样即使数据库泄露了,但由于不是原始密码,安全性也还好。
但随着 MD5、SHA1 被攻破,即两个不同文件得到相同的信息摘要,上述数据库还是变得不够安全。
张三和王五的密码 Hash(摘要值)是一样的,这也就意味着攻击者使用彩虹表(常用密码和对应 Hash 值的表)攻击,这样就能破解多个账号。
于是,给密码加点盐,即使相同密码也因为盐值的不同从而生成不同的 Hash 值,数据库就变成了这样:
保存了密码+Salt 得到的 Hash 值,同时也把盐值保存下来;
用户登录时后台就需要把密码+Salt 做相同 Hash,去比较数据库中的密码 Hash 是否相等,这样也就提高了安全性。
值得注意的是,这个盐值是要求随机生成的,就跟我们做菜一样,多加一勺盐和少加一勺盐,出来的菜品味道确实不一样,所以一般大师都说适量盐,谁知道这个适量是多少呢?
END
作者:快乐的肌肉
文章来源:汽车MCU软件设计
推荐阅读
更多物联网安全,PSA 等技术干货请关注平台安全架构(PSA)专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入PSA 技术交流群,请备注研究方向。