Khorina · 2 天前

加密、签名我们知道,那加盐又是什么?

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 填充方式开始说起,流程如下:

image.png

原始数据 M 经过 Hash 计算得到 mHash,接下来一步就是要对这个 mHash 进行填充并再做 Hash 作为 EM 的一部分即 H,在构建 M*时就利用到了 Salt。

根据 RFC3447 描述,Salt 是一段随机生成的数据,因此让 M*变得更加不可预测,这样再次通过 Hash 计算出来的 Hash 值就会更加随机,从而在某种程度上让签名变得不可预测。

2.密码中的盐值

基于上述理论,可以总结,加盐的目的用来增强 Hash,这在密码存储领域显得尤为重要。

还记得最开始学 C 语言,要求设计一个用户登录系统吗?

最开始没有任何密码学基础知识,设计出来的用户数据库必定长成这样:

Image

这种数据库一旦泄露,那么所有用户名和密码都会被泄露。

老师告诉说你可以利用 Hash 算法的抗碰撞来增强安全性,因此优化后的用户数据库长这样:

Image

我不存密码了,存放的是密码经过某 Hash 函数计算得到的 Hash 值。用户登录时输入密码,后台对这个密码执行相同 Hash 函数,和数据库中的 Hash 值比对,这样即使数据库泄露了,但由于不是原始密码,安全性也还好。

但随着 MD5、SHA1 被攻破,即两个不同文件得到相同的信息摘要,上述数据库还是变得不够安全。

张三和王五的密码 Hash(摘要值)是一样的,这也就意味着攻击者使用彩虹表(常用密码和对应 Hash 值的表)攻击,这样就能破解多个账号。

于是,给密码加点盐,即使相同密码也因为盐值的不同从而生成不同的 Hash 值,数据库就变成了这样:

Image

保存了密码+Salt 得到的 Hash 值,同时也把盐值保存下来;

用户登录时后台就需要把密码+Salt 做相同 Hash,去比较数据库中的密码 Hash 是否相等,这样也就提高了安全性。

值得注意的是,这个盐值是要求随机生成的,就跟我们做菜一样,多加一勺盐和少加一勺盐,出来的菜品味道确实不一样,所以一般大师都说适量盐,谁知道这个适量是多少呢?

END

作者:快乐的肌肉
文章来源:汽车MCU软件设计

推荐阅读

更多物联网安全,PSA 等技术干货请关注平台安全架构(PSA)专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入PSA 技术交流群,请备注研究方向。
推荐阅读
关注数
4571
内容数
197
Arm发布的PSA旨在为物联网安全提供一套全面的安全指导方针,使从芯片制造商到设备开发商等价值链中的每位成员都能成功实现安全运行。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息