news 2026/4/18 11:22:57

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

作者头像

张小明

前端开发工程师

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/18 5:23:04

系统流异世探险动态漫制作2025推荐,全方位解析

系统流异世探险动态漫制作2025推荐,全方位解析在当今的动态漫制作领域,系统流异世探险题材凭借其独特的魅力吸引了众多观众的目光。然而,要制作出一部优秀的系统流异世探险动态漫并非易事,需要在多个方面进行精心策划和制作。本文…

作者头像 李华
网站建设 2026/4/18 3:29:12

vue基于Spring Boot的婚恋相亲交友网站_6wivw6dp

目录 具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring…

作者头像 李华
网站建设 2026/4/18 3:25:28

vue基于Spring Boot的教育ppt资源分享下载推荐平台_y9ktf0ec_

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/4/18 3:29:36

第二十七周周报

文章目录 摘要Abstract一.背景分析二、创新点三、实验和结果分析总结 摘要 本周研读的文献《基于 GAN 的中文虚假评论数据集生成方法》针对当前中文虚假评论检测研究中缺乏公开数据集的现状,提出了一种利用生成对抗网络(GAN)构建中文虚假评论…

作者头像 李华
网站建设 2026/4/18 3:32:44

高效的5个pandas函数,你都用过吗?

之前为大家介绍过10个高效的pandas函数,颇受欢迎,里面的每一个函数都能帮我们在数据分析过程中节省时间。pandas还有很多让人舒适的用法,这次再为大家介绍5个pandas函数,作为这个系列的第二篇。1. explodeexplode用于将一行数据展…

作者头像 李华
网站建设 2026/4/18 8:19:43

基于Java的安全生产考试座位签到智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ?安全生产考试座位签到智慧管理系统主要功能模块包括会员管理、机构管理、考试安排管理、座位管理和理论签到管理。该系统采用SpringMVC开发框架,MySQL数据库,并结合JavaScript和ECharts.js实现数据可视化。普通员工负…

作者头像 李华