当前位置: 首页 > news >正文

使用哈希函数存储密码时为什么要加“盐”?

作者:chen-true@qq.com

仅供学习交流,如有错误恳请指出!

===========================================

1)“盐”是什么

系统存储用户密码时,通常不会直接存储明文密码,而是存储密码的哈希值。更准确地说,存储的是h = H(密码+盐),而不是h = H ( 密码 )

在密码存储中:

·盐(Salt):是一段随机生成的额外数据,通常是若干字节的随机数,比如16字节、32字节。

·加盐:在对密码做哈希之前,把密码和盐组合起来再哈希。

这个盐是跟每个用户绑定的,一般是“每个用户一个随机盐”,存数据库时会把哈希值h和盐一起存储。并且盐可以明文存储在数据库里,不需要加密隐藏。

2)为什么要加盐?

之所以必须加盐,核心原因不是“把密码再变复杂一点”,而是防止离线攻击中的“批量复用”。

当我们存储密码的数据库泄露后,攻击者往往拿到的是一批哈希值。如果系统中存储的是h = H ( 密码 ),那么会有以下问题:

问题1:两个用户只要密码相同,哈希值就完全相同。攻击者不用破解就能判断“这两个人密码一样”,并且一旦破解出某个哈希值对应的明文密码,就能立即解锁所有同哈希值的账号(批量命中)。

问题2:攻击者可以提前把常见密码全部算出h = H ( 密码 )并存成表(一般叫做字典或彩虹表)。拿到我们的数据库密码哈希值后,只需要查表匹配哈希值,就有可能找到明文密码,成本极低。

更糟的是,这种预计算成果还能跨系统复用:只要别的系统也用同样的哈希算法且不加盐,攻击者的表就能继续用。

问题3:只要拿到哈希值,攻击者可以在自己本地机器上狂暴穷举密码,不会触发我们的登录限制、风控、验证码等,毫无阻力。

加入盐后,哈希变为h = H(密码+盐)。如果每个用户都有不同且随机的盐,那么即便大家使用同一个密码,最终哈希也会不同。攻击者想用字典爆破时,必须针对每个盐重新计算一遍,从“一份计算覆盖全部用户”变成“每个用户一份计算”,攻击成本被成倍放大。

需要强调的是:盐不需要保密,通常与哈希值一起存储。盐的作用不是隐藏密码,而是让每个用户的哈希值都独一无二,打碎预计算与批量复用。

在工程实践中,仅仅“加盐再用普通哈希(如MD5/SHA-256)”仍不理想,因为它们计算太快。实际应使用专门的密码哈希/派生算法(如Argon2id、bcrypt、scrypt、PBKDF2),在加盐的基础上进一步提高单次猜测成本。

3)为什么要叫做“盐”?

“盐(salt)”这个名字主要是来自比喻,不是因为哪个标准硬规定“必须叫盐”。我们可以从以下几个角度来理解:

1、最直观的角度:跟做饭一样的“加盐”

做饭时:

·有一盘菜 = 原始数据或者密码

·往里面撒盐 = 加入一小撮额外的东西

·虽然菜本身一样,但加盐的量和方式不同,味道就会不一样

对密码来说:

·同一个密码123456

·不同的盐:salt1和salt2

·计算H(123456+salt1)H(123456+salt2)得到的哈希值完全不同

所以“盐”这个词非常形象:同样的“菜”(密码),因为加了不同的“盐”,味道(哈希值)就不一样了。

2、“盐”还有“防腐、防坏”的含义

盐可以用来腌制、保存食物,防止腐坏。对应到安全领域:

·原始密码 = 容易“变质”的敏感东西

·盐 = 额外的防护手段

·加盐之后,密码的哈希值更难被“腐蚀”(破解)

所以“salt”这个词在英语里,本来就有“腌制、保护”的含义,用在密码学上也说得通。

3、“撒盐”等于“撒随机性”

想象我们在一张桌子上撒盐,盐粒落点是乱七八糟、不规则的。

密码学里,加盐也是往系统里加额外的随机性:

·不同用户对应不同的随机盐

·同一个密码,用在不同网站/不同环境里会产生完全不同的哈希值

·攻击者没法用一张预先算好的“万能表”搞定所有人

这跟现实中“撒一把盐,颗粒散落一地”很像:分布杂、难预测。

http://www.jsqmd.com/news/89216/

相关文章:

  • 给女神发“在吗”,她回了个表情包是几个意思?—— 硬核探讨TCP 三次握手
  • 抖音卖货起号精细化运营第一天看懂五维四率复盘
  • 力扣 Hot 100 之 206. 反转链表:面试官的“开胃菜”
  • 课程设计自主选题————图书管理系统
  • AI 工具实战测评:它们到底是“生产力工具”,还是“智商税”?
  • 10394_基于Springboot的社区生活事务管理系统
  • vue基于Spring Boot的灌区取用水量调配信息管理系统的应用和研究_2dw80bw4
  • HTML如何设计大文件上传的权限控制与验证机制?
  • 函数介绍及使用
  • .NET周刊【11月第3期 2025-11-16】
  • BLOG-2-数字电路模拟程序及课堂测验
  • 探索电机控制器IGBT结温估算:从算法到模型的深度揭秘
  • Vue.js如何设计大文件上传的日志记录与监控?
  • vue基于Spring Boot的检察院企业单位会议记录系统的应用和研究_44l22b02
  • 详细介绍:【C++STL】priority_queue 模拟实现与仿函数实战
  • 数据资产平台(数据血缘、数据资产地图)技术框架图
  • Comsol 二维轴对称双温方程 固体传热变形几何(有烧蚀效果) 附带参考模型和参考文献
  • 感应电机转子磁场定向FOC仿真与异步电机调速控制仿真那些事儿
  • 提前备赛GESP(统一讲解了从C++2级到C++7级的考点与策略) - 教程
  • Simplorer与Maxwell电机联合仿真:探索电机控制的新旅程
  • python脚本攻击Easy File Sharing Web Server
  • 无刷直流电机双闭环仿真:稳定运行与制动工况下的调制探索
  • 完整教程:JAVA同城服务场馆预约门店预约健身房瑜伽馆预约系统支持H5小程序APP源码
  • 西门子WINCC在暖通空调及公用系统项目中的实战分享
  • 复现《基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计
  • 聊聊三相、五相电机的容错控制
  • 【超全】基于SSM的学生信息管理系统【包括源码+文档+调试】
  • 探索Python实现全覆盖路径规划之A*算法
  • 两次数字电路模拟程序迭代作业
  • Anchor Learning with Potential Cluster Constraints for Multi-view Clustering---基于潜在聚类约束的锚点学习用于多视图聚类