news 2026/4/16 2:52:15

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用哈希函数存储密码时为什么要加“盐”?

作者: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、“撒盐”等于“撒随机性”

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

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

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

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

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:14:21

最近在实验室折腾三相逆变器的控制方案,发现双闭环结构真是越玩越有意思。今天就拿Simulink仿真过程当案例,聊聊那些让人又爱又恨的调试细节

电力电子三相无源逆变器的控制simulink仿真 电压外环电流内环双闭环 dq解耦控制 PWM调制 LC滤波器 离散仿真 先说说核心架构——电压外环套着电流内环的套娃结构。这就像开车时既要控制车速又要把握方向盘,外环负责输出电压维稳,内环死磕电流动态响应。…

作者头像 李华
网站建设 2026/4/16 10:14:13

006发布文章测试用例

需求 测试点 在测试设计过程中,首先需要根据需求的描述方式对需求进行分类。 对于规则型需求,需求主要体现在对输入内容的限制和校验规则上(如长度、格式、是否为空等),测试点分析时应围绕各项规则拆分正向与逆向测试点…

作者头像 李华
网站建设 2026/4/16 10:20:25

探索电机控制器IGBT结温估算:从算法到模型的深度揭秘

电机控制器,IGBT结温估算(算法模型)国际大厂机密算法,多年实际应用,准确度良好 能够同时对IGBT内部6个三极管和6个二极管温度进行估计,并输出其中最热的管子对应温度。 可用于温度保护,降额&…

作者头像 李华
网站建设 2026/4/16 10:18:48

复现《基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计

【复现】:《基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计》该程序对应文章《Power System Dynamic State Estimation Using Extended and Unscented Kalman Filters》,电力系统状态的准确估计对于提高电力系统的可靠性、弹性、安全性和稳定…

作者头像 李华
网站建设 2026/4/15 15:02:42

什么叫“结构表示”和“文本表示”不对齐?(Self)

在做 GNN 文本 / LLM 的服务推荐时,经常会看到一句话:“现有方法难以有效对齐结构表示与文本表示。”第一次看到这句话时,很容易误以为是向量数值范围不一样、尺度不同之类的数学问题。 但其实,这个理解是 不对的。一句话先说结论…

作者头像 李华
网站建设 2026/4/16 10:21:12

昇腾CANN性能剖析实战 - 从工具使用到深度优化

目录 1 摘要 2 性能剖析工具链架构解析 2.1 设计理念与核心价值 2.2 关键性能指标与理论基准 3 性能数据采集实战指南 3.1 环境配置与采集启动 3.2 多维度数据采集策略 4 性能数据深度分析方法 4.1 流水线效率分析 4.2 时间线数据分析 5 常见性能瓶颈优化实战 5.1 …

作者头像 李华