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

从“盐值”到“密钥”:HMAC比普通哈希强在哪?一个登录案例讲明白

从“盐值”到“密钥”HMAC比普通哈希强在哪一个登录案例讲明白在用户认证系统中密码存储方案的选择直接影响着系统的安全性。许多开发者误以为“加盐哈希”已经足够安全甚至将其与HMAC混为一谈。本文将用一个真实的登录系统案例带你彻底理解HMAC的独特价值。1. 为什么加盐哈希还不够假设我们正在开发一个用户系统需要存储用户密码。最基础的做法是使用MD5等哈希函数# 不安全的简单哈希示例 import hashlib password user123 hashed hashlib.md5(password.encode()).hexdigest() # 输出6ad14ba9986e3615423dfca256d04e3f这种方法存在明显问题彩虹表攻击攻击者可以预先计算常见密码的哈希值进行反向查找碰撞风险不同密码可能产生相同哈希值于是开发者引入了“加盐”salt机制# 加盐哈希示例 import hashlib, os salt os.urandom(16) # 随机生成16字节盐值 password user123 hashed hashlib.pbkdf2_hmac(sha256, password.encode(), salt, 100000)加盐哈希确实提高了安全性但仍存在以下局限安全特性加盐哈希HMAC防彩虹表攻击✅✅防长度扩展攻击❌✅密钥集成❌✅消息认证❌✅2. HMAC的“双重锁”机制HMACHash-based Message Authentication Code通过独特的“ipadopad”双轮处理构建了比普通加盐哈希更强的安全屏障。让我们拆解它的工作流程2.1 密钥准备阶段首先对密钥进行处理如果密钥短于哈希函数分组长度补零到分组长度如果密钥长于分组长度先对密钥做哈希// Go语言中的密钥处理示例 func prepareKey(key []byte, hashFunc func() hash.Hash) []byte { blockSize : hashFunc().BlockSize() if len(key) blockSize { h : hashFunc() h.Write(key) return h.Sum(nil) } if len(key) blockSize { padded : make([]byte, blockSize) copy(padded, key) return padded } return key }2.2 双重混淆过程HMAC的核心在于两个特殊的常量ipadinner pad0x36重复到分组长度opadouter pad0x5C重复到分组长度处理流程如下密钥与ipad异或 → 得到ipadkey将ipadkey与消息组合 → 计算第一轮哈希hash1密钥与opad异或 → 得到opadkey将opadkey与hash1组合 → 计算最终HMAC值// Java实现HMAC-SHA256的核心逻辑 public static byte[] hmacSha256(byte[] key, byte[] message) { byte[] ipad new byte[64]; // SHA-256分组长度64字节 byte[] opad new byte[64]; Arrays.fill(ipad, (byte) 0x36); Arrays.fill(opad, (byte) 0x5C); byte[] preparedKey prepareKey(key, SHA-256); byte[] ipadKey xorBytes(preparedKey, ipad); byte[] opadKey xorBytes(preparedKey, opad); // 第一轮哈希 byte[] hash1 sha256(concat(ipadKey, message)); // 第二轮哈希 return sha256(concat(opadKey, hash1)); }这种“双重处理”机制就像给保险箱上了两把不同的锁第一道锁ipad确保消息完整性第二道锁opad提供认证保障3. 实战登录系统中的HMAC应用让我们看一个完整的用户认证流程实现3.1 注册阶段# 用户注册时密码处理 import hmac, hashlib, os def register(username, password): # 生成随机密钥非盐值 secret_key os.urandom(32) # 计算HMAC hmac_digest hmac.new(secret_key, password.encode(), hashlib.sha256).digest() # 存储到数据库 store_to_db(username, { hmac: hmac_digest.hex(), key: secret_key.hex() # 密钥需要安全存储 })3.2 登录验证def login(username, attempted_password): user_data get_from_db(username) if not user_data: return False secret_key bytes.fromhex(user_data[key]) # 重新计算HMAC attempt_hmac hmac.new(secret_key, attempted_password.encode(), hashlib.sha256).digest() # 安全比较 return hmac.compare_digest(attempt_hmac, bytes.fromhex(user_data[hmac]))关键安全优势防长度扩展攻击攻击者无法在已知哈希值基础上扩展数据密钥保密即使数据库泄露没有密钥也无法伪造有效HMAC消息认证确保密码确实来自密钥持有者4. 何时选择HMAC而非加盐哈希HMAC特别适合以下场景API请求验证# 典型API签名方案 timestamp$(date %s) message${timestamp}|${request_path}|${request_body} signature$(echo -n $message | openssl dgst -sha256 -hmac $api_secret)会话令牌生成// JWT签名示例 const header base64url({alg: HS256, typ: JWT}); const payload base64url({sub: user123, iat: Date.now()}); const signature hmacSha256(secretKey, ${header}.${payload}); const token ${header}.${payload}.${signature};敏感操作确认如转账验证相比之下普通加盐哈希更适合密码存储配合PBKDF2/scrypt/argon2等慢哈希函数简单数据完整性检查5. 深入理解HMAC的安全本质HMAC的安全强度建立在三个关键基础上哈希函数的抗碰撞性即使找到hash(X) hash(Y)也无法推导出hmac(X) hmac(Y)密钥的秘密性没有密钥攻击者无法构造有效MAC双重处理的不可逆性无法从最终MAC值反推出原始密钥实际项目中需要注意密钥管理比算法选择更重要。应将密钥存储在安全的密钥管理系统如AWS KMS、Hashicorp Vault中而非代码或配置文件中。现代最佳实践推荐优先使用HMAC-SHA256或HMAC-SHA3密钥长度至少32字节定期轮换密钥但需处理历史数据迁移在微服务架构中HMAC常用于服务间认证。例如// 服务间HMAC认证中间件 func HMACMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { receivedSig : r.Header.Get(X-Signature) timestamp : r.Header.Get(X-Timestamp) // 验证时间有效性 if time.Since(time.Unix(timestamp, 0)) 5*time.Minute { http.Error(w, Expired, http.StatusUnauthorized) return } // 重构消息 body, _ : io.ReadAll(r.Body) message : fmt.Sprintf(%s|%s|%s, timestamp, r.URL.Path, body) // 计算期望签名 mac : hmac.New(sha256.New, serviceSecret) mac.Write([]byte(message)) expectedSig : hex.EncodeToString(mac.Sum(nil)) // 安全比较 if !hmac.Equal([]byte(receivedSig), []byte(expectedSig)) { http.Error(w, Invalid signature, http.StatusForbidden) return } next.ServeHTTP(w, r) }) }这个实现展示了HMAC在实际架构中的应用要点包含时间戳防重放攻击签名包含请求所有关键元素使用恒定时间比较函数合理的错误处理理解HMAC的底层机制能帮助开发者在设计安全系统时做出更明智的选择。下次当你需要在“简单加盐”和HMAC之间抉择时记住HMAC提供的不仅是完整性保护更是可靠的消息认证——这正是现代安全系统最需要的特性。

相关文章:

从“盐值”到“密钥”:HMAC比普通哈希强在哪?一个登录案例讲明白

从“盐值”到“密钥”:HMAC比普通哈希强在哪?一个登录案例讲明白 在用户认证系统中,密码存储方案的选择直接影响着系统的安全性。许多开发者误以为“加盐哈希”已经足够安全,甚至将其与HMAC混为一谈。本文将用一个真实的登录系统案…...

Qwen3.5-9B-AWQ-4bit WSL2开发环境配置:在Windows上无缝运行Linux模型服务

Qwen3.5-9B-AWQ-4bit WSL2开发环境配置:在Windows上无缝运行Linux模型服务 1. 为什么要在WSL2中运行AI模型? 对于Windows开发者来说,直接在本地运行Linux环境下的AI模型服务一直是个挑战。WSL2(Windows Subsystem for Linux&…...

GLM-4-9B-Chat-1M效果实测:1M上下文下跨500页文档的因果推理与事实核查

GLM-4-9B-Chat-1M效果实测:1M上下文下跨500页文档的因果推理与事实核查 1. 引言:当AI遇上超长文本 想象一下,你面前放着500页的文档资料,需要从中找出特定信息、分析因果关系、验证事实准确性。这对人类来说都是个艰巨任务&…...

DeerFlow 系列教程 第二十篇 | 前端定制与二次开发指南

DeerFlow 系列教程 第二十篇 本篇教程延续**模块六:部署与运维(工程实践)**的内容。我们将深入 DeerFlow 前端架构,帮助有开发需求的读者理解其技术栈、源码结构和核心交互流程,从而能够进行定制化开发和二次开发。内容涵盖:Next.js 16 App Router + React 19 + Tailwind…...

DeerFlow 系列教程 第十七篇 | 实战案例二——用 DeerFlow 生成数据可视化与分析报告

DeerFlow 系列教程 第十七篇 本篇教程继续模块五:实战应用场景(案例驱动),展示如何使用 DeerFlow 的数据分析和可视化技能。我们将剖析 data-analysis 技能基于 DuckDB 的 SQL 分析引擎、chart-visualization 技能的 26 种图表类型选择与渲染机制、从文件上传到报告输出的完…...

【AI Agent实战】养了一个月AI Agent,我的工作方式发生了5个根本变化|养虾系列17·收官

不是"效率提高了X%"——那种数字好看但没意义。 而是工作方式本身变了。像从手洗衣服变成用洗衣机——不只是快了,是你再也不想手洗了。变化1:从"自己做"到"描述→审核→微调" 之前所有工作亲力亲为——写报告自己写&…...

JetBrains全家桶通用警告优化方案:我用这份settings文件统一了IDEA/PyCharm/GoLand的代码提示风格

JetBrains全家桶通用警告优化方案:统一IDEA/PyCharm/GoLand的代码提示风格 作为全栈开发者,我们常常需要在不同语言的IDE之间切换。JetBrains系列工具虽然强大,但默认的代码检查规则往往过于"热心"——那些红黄交错的波浪线不仅分散…...

别再死记硬背了!用Python+Modbus-TCP/RTU模拟器,5分钟搞懂BMS通信协议

用PythonModbus模拟器5分钟实战BMS通信协议 第一次接触BMS通信协议时,我被厚厚的文档吓退了——各种寄存器地址、功能码、校验算法像天书一样。直到发现用Python脚本配合Modbus模拟器,原来理解协议可以如此直观。本文将带你用不到5分钟的实操&#xff0c…...

影刀RPA实战指南:从零到一构建自动化流程

1. 为什么你需要影刀RPA? 第一次接触影刀RPA是在三年前,当时我每天要花两小时处理Excel报表。直到同事演示了一个自动化脚本——原本需要手动操作半小时的合并表格工作,现在点一下按钮10秒就能完成。这种效率提升的震撼,让我彻底迷…...

阅读量优化的五个关键动作

别把阅读量当成玄学你可能每天盯着后台数据,看着那点可怜的阅读数发愁。其实,阅读量优化不是靠运气,也不是靠堆关键词,而是有迹可循的系统动作。很多人误以为只要内容“好”,自然有人看——但现实是,再好的…...

用Python的pysubs2库批量给ASS字幕加特效:从自动变色到卡拉OK动画

用Python的pysubs2库批量给ASS字幕加特效:从自动变色到卡拉OK动画 在视频制作领域,字幕不仅是传达信息的工具,更是视觉艺术的重要组成部分。传统手工添加特效的方式效率低下,特别是面对数百条字幕时,重复劳动令人疲惫。…...

如何打造国际范包装设计,这家机构有妙招

一、行业痛点分析在包装设计领域,打造具有国际范的包装面临诸多挑战。数据显示,约70%的产品因包装缺乏国际吸引力而在国际市场上遭遇销售瓶颈。其中,设计风格难以融合多元文化元素,导致产品在不同国家和地区的接受度较低&#xff…...

生成式AI多语言支持不是加个翻译API!资深NLP架构师首曝内部验证的4级合规性校验矩阵

第一章:生成式AI应用多语言支持方案 2026奇点智能技术大会(https://ml-summit.org) 生成式AI应用的全球化落地,核心挑战之一在于构建鲁棒、可扩展且语义一致的多语言支持能力。这不仅涉及文本翻译,更涵盖提示工程本地化、文化适配、低资源语…...

从零构建多焦点图像融合桌面应用:PyQt5界面、深度学习模型与源码全解析

1. 为什么需要多焦点图像融合? 拍照时经常会遇到这样的困扰:当你对准近处的花朵对焦,远处的山水就变得模糊;反过来聚焦山水时,花朵又失去了细节。这就是相机景深限制带来的难题。多焦点图像融合技术就是为了解决这个问…...

STM32无刷直流电机驱动实战:H_PWM_L_ON模式详解

1. H_PWM_L_ON模式基础原理 无刷直流电机(BLDC)的驱动方式多种多样,其中H_PWM_L_ON模式因其简单高效的特点,在中小功率应用中非常受欢迎。这种模式的核心思想是:上桥臂采用PWM信号控制,下桥臂则保持常开或…...

山东居士林:天辛大师浅谈如何用AI研究恽铁樵医学经验传承

在近代中医发展的风云激荡期,恽铁樵是绝对无法绕开的核心人物——恽师本是出身江南文脉的知名报人,中年因丧子痛悟医术,弃文从医后不仅以“铁樵”为名立誓精进,更在中西医论争的百年关口,扛起了“中医科学化”的大旗&a…...

Latex小白必看:从零开始搭建学术论文模板(含代码示例)

LaTeX学术论文模板搭建实战指南:从零基础到高效排版 第一次接触LaTeX时,我被它复杂的语法和命令行界面吓得不轻。但当我完成第一篇论文后,那种对排版细节的完美掌控感让我彻底爱上了这个工具。与Word不同,LaTeX让你专注于内容本身…...

前端——别再轮询了!手摸手教你用WebSocket打造实时应用,面试必问

引言 你有没有遇到过这样的场景: 用户抱怨直播间弹幕延迟好几秒、消息收不到、在线人数显示不准… 而你明明用的是轮询,每秒请求一次,服务器都快扛不住了。 这不是段子,这是我去年接手一个项目时的真实写照。 轮询&#xff0c…...

保姆级教程:3步快速部署VoxCPM-1.5-WEBUI,开启本地语音合成之旅

保姆级教程:3步快速部署VoxCPM-1.5-WEBUI,开启本地语音合成之旅 1. 为什么选择本地语音合成? 在数字内容爆炸式增长的今天,语音合成技术已经成为内容创作、智能客服、教育辅助等领域的重要工具。然而,传统的云端语音…...

用eNSP模拟企业网:手把手教你配置华为防火墙的‘安全策略’放行IPSec流量

eNSP实战:华为防火墙IPSec流量放行的三大安全策略陷阱与解决方案 第一次在eNSP中完成IPSec VPN配置却遭遇ping不通时,我盯着屏幕上"Request timeout"的提示,花了整整三小时才意识到问题出在哪里——不是IKE协商失败,不是…...

uni-app——一招修复:uni-app picker在iOS真机底部弹窗左右留白/被截断的问题

导读: 明明微信开发者工具里显示完美,一上iOS真机,底部的Picker就被“砍了一刀”?左右留白、内容残缺?别急着怀疑人生,这不是你的代码逻辑错了,而是iOS WebView的一个“视口陷阱”。本文将带你3分钟定位问题,并给出根治方案。 🔥 问题现象:一次“完美”的翻车 在un…...

EVAL-AD7616SDZ评估板实战:用STM32双SPI实现16通道同步数据采集(附完整工程)

EVAL-AD7616SDZ评估板实战:用STM32双SPI实现16通道同步数据采集 在工业自动化、电力监控和精密测量领域,多通道同步数据采集系统对信号完整性和时序一致性有着严苛要求。AD7616作为一款16位双通道同步采样的16通道ADC,凭借其出色的性能和灵活…...

5分钟搞定!Meta-Llama-3-8B-Instruct对话应用搭建实录

5分钟搞定!Meta-Llama-3-8B-Instruct对话应用搭建实录 1. 为什么选择Meta-Llama-3-8B-Instruct Meta-Llama-3-8B-Instruct是Meta公司2024年4月最新开源的80亿参数指令微调模型,专为对话场景优化。相比前代产品,它在以下几个方面表现突出&am…...

第9章 函数-9.9 函数式编程

函数式编程是一种抽象程度很高的编程范式,它将一个问题分解成一系列函数。函数式编程语言编写的函数是没有变量的,在理想情况下,函数只接受输入并输出结果,即只要输入是确定的,输出结果就是确定的,在这种情…...

Hermes Agent:从自进化智能体到分布式生产力内核的深度研究报告

文章目录 一、 纵向分析:Hermes Agent 的诞生、演化与智能复利的积累1. 起源追溯:去中心化理想与大模型“失忆症”的对抗2. 诞生的前奏:基础设施的垂直整合与技术蓄力3. 诞生节点:2026 年初的“自生长”宣言4. 演进历程&#xff1…...

TI IWR1443毫米波雷达实测:用MATLAB复现多普勒相偏补偿,把测速范围翻倍

TI IWR1443毫米波雷达实测:MATLAB实现多普勒相偏补偿与速度解模糊全流程解析 毫米波雷达在自动驾驶、工业检测等领域的应用日益广泛,但速度测量范围受限一直是实际工程中的痛点问题。本文将带您从原始数据开始,一步步实现基于多普勒相偏补偿的…...

避开这3个坑!SAP生产订单确认参数配置避雷指南(CO11/CO11N篇)

SAP生产订单确认参数配置实战避坑指南:从报错现象到精准修复 在SAP PP模块的实施和运维过程中,生产订单确认(CO11/CO11N)环节的参数配置堪称"隐形杀手"。表面上看只是几个复选框的设置,实际却直接影响车间报工效率和数据准确性。本…...

【2026智能办公分水岭】:AIPPT生成工具三大技术壁垒突破,微软/谷歌尚未公开的核心架构解析

第一章:【2026智能办公分水岭】:AIPPT生成工具三大技术壁垒突破,微软/谷歌尚未公开的核心架构解析 2026奇点智能技术大会(https://ml-summit.org) 2026年,AIPPT生成工具正式跨越“幻觉驱动演示”阶段,进入“意图-结构…...

给DSP新手:手把手教你用C671x的EDMA搬数据,告别CPU等待(附代码示例)

给DSP新手:手把手教你用C671x的EDMA搬数据,告别CPU等待(附代码示例) 在嵌入式实时系统中,数据搬运效率往往成为性能瓶颈的关键。想象这样一个场景:你的DSP正在处理来自高速ADC的采样数据流,CPU不…...

Ubuntu20.04下基于cephadm的Ceph集群高效部署指南

1. 环境准备:打造Ceph集群的基石 在Ubuntu 20.04上部署Ceph集群前,需要像搭积木一样先打好地基。我遇到过不少初学者因为环境配置不当导致后续步骤失败的情况,所以这里会详细说明每个环节的避坑要点。 硬件配置方面,建议每台节点至…...