HMAC 生成與驗證
建议密钥长度与哈希输出长度一致:SHA-1=20 字节,SHA-256=32 字节,SHA-384=48 字节,SHA-512=64 字节
說明
- • HMAC 基于密钥和哈希算法生成签名,用于认证消息来源与完整性
- • 支持 SHA-1 / SHA-256 / SHA-384 / SHA-512
- • 生成与验证均在浏览器本地运行,不上传数据
- • 验证采用固定长度逐字节比较,降低时序差异
免費線上 HMAC 生成與驗證工具,支援 HMAC-SHA256/384/512、SHA1、MD5,可用於 API 簽章、Webhook 驗證、訊息認證碼校驗與安全聯調。所有計算都在瀏覽器本地完成,金鑰不會上傳。
相關推薦
什麼是HMAC 生成與驗證?
HMAC(Hash-based Message Authentication Code,基于哈希的訊息認證码)是一种广泛使用的訊息認證技术,由 RFC 2104 定义。HMAC 将金鑰与訊息一起通过哈希函数处理,生成一个固定长度的簽章。相比普通哈希,HMAC 需要知道金鑰才能生成或驗證簽章,因此同时保证了訊息的完整性和来源真实性。
**HMAC 是现代 API 安全的基石**。Stripe、GitHub、Shopify、Slack、Twilio 等平台使用 HMAC-SHA256 簽章 Webhook 事件,确保請求确实来自平台而非伪造。AWS 使用 HMAC-SHA256 实现 Signature V4 請求簽章。JWT 的 HS256 演算法本质就是 HMAC-SHA256。理解 HMAC 是掌握 API 安全的第一步。
**不同平台的簽章格式各有不同**:Stripe 簽章格式为 `t=timestamp,v1=hex_signature`,需要簽章的内容是 `timestamp.payload`;GitHub 使用 `X-Hub-Signature-256` 头,格式为 `sha256=hex_signature`;Shopify 使用 `X-Shopify-Hmac-Sha256`,值为 Base64 编码。本工具支持这些常见格式的自动解析和驗證。
**为什么簽章驗證会失败?** 最常见的原因是訊息格式不匹配:平台可能簽章的不是原始訊息体,而是 `timestamp.payload` 这样的组合字串;或者訊息包含额外换行;或者簽章包含前缀(如 `sha256=`)但你没有去掉。仔细对照平台文档,使用十六進位原始值进行比对。
工具使用瀏覽器原生 **Web Crypto API**(SubtleCrypto)实现 HMAC 计算,与 HTTPS 和 TLS 使用的加密库是同一套代码。所有计算在本地完成,金鑰和訊息不发送到任何伺服器。打开瀏覽器开发者工具的网络面板,可以驗證全程无任何外网請求。
適用場景
- Stripe Webhook 开发:除錯 Stripe 支付回调,驗證 `Stripe-Signature` 头是否正确
- GitHub Webhook 集成:驗證 GitHub Push、Pull Request 等事件的 `X-Hub-Signature-256` 簽章
- Shopify 订单同步:驗證 Shopify 订单更新 Webhook 的 `X-Shopify-Hmac-Sha256` 簽章
- Slack Bot 簽章:驗證 Slack 事件回调的 `X-Slack-Signature` 簽章
- JWT 开发除錯:使用 HS256 簽章 JWT,驗證 Token 有效性
- API 請求簽章:实现 AWS Signature V4 或自定义 API 簽章方案
使用方法
- 选择演算法:默认 HMAC-SHA256,现代 API 推荐使用
- 输入訊息:粘贴原始訊息体或 API 請求内容
- 输入金鑰:输入 Webhook Secret 或 API Secret
- 选择格式:选择輸出格式(Stripe 用 hex,JWT 用 Base64URL)
- 驗證簽章:切换到驗證模式,粘贴待驗證簽章进行比对
功能特點
- 多种演算法支持:HMAC-SHA256/384/512、SHA1、MD5,覆盖现代 API 和遗留系统
- Webhook 簽章驗證:内置 Stripe/GitHub/Shopify/Slack 簽章格式支持,自动解析常见格式
- 三格式輸出:Hex / Base64 / Base64URL,适配不同 API 和平台要求
- 实时生成:输入变化自动计算,300ms 防抖,无需点击按钮
- 簽章驗證模式:输入待驗證簽章自动比对,实时显示匹配结果
- 金鑰长度检测:实时检测金鑰强度,过短时显示警告
- 瀏覽器端处理:Web Crypto API 本地计算,金鑰和訊息不上傳伺服器
- JWT 支持:HMAC-SHA256 輸出可直接用于 HS256 簽章
常見問題
HMAC 和普通哈希有什么区别?
普通哈希(如 SHA256)只对訊息本身做摘要,任何人都能计算。HMAC 在哈希过程中引入金鑰,只有知道金鑰的人才能生成或驗證正确的簽章。HMAC 同时保证訊息完整性和来源認證,而普通哈希只能驗證完整性。
如何驗證 Stripe/GitHub/Shopify 的 Webhook 簽章?
不同平台的簽章格式略有不同:Stripe 使用 `Stripe-Signature` 头,格式为 `t=timestamp,v1=hex_signature`,需簽章字串为 `timestamp.payload`;GitHub 使用 `X-Hub-Signature-256`,格式为 `sha256=hex_signature`;Shopify 使用 `X-Shopify-Hmac-Sha256`,值为 Base64 编码。本工具支持直接粘贴这些簽章进行驗證。
輸出格式 Hex、Base64、Base64URL 有什么区别?
Hex 是十六進位格式(如 0-9、A-F),人类可读,适合除錯。Base64 是 64 字符编码,体积更小,适合嵌入 JSON。Base64URL 是 URL 安全版本(将 +/ 替换为 -_),用于 JWT 头部和 URL 参数傳輸。
应该选哪种 HMAC 演算法?
推荐使用 **HMAC-SHA256**:这是现代 API 和 Webhook 的标准(Stripe、GitHub、Shopify、Slack 都用 SHA256),32 字节輸出,通用性最好。SHA-512 安全性更高但輸出更长(64 字节)。SHA1 仅用于兼容遗留系统。MD5 已废弃,仅用于极老的 API。
金鑰长度有什么要求?
金鑰越长越安全。建议至少 16 个字符(128 位),生产环境建议 32 个以上字符。工具会检测金鑰长度,如果太短会显示警告。使用 cryptographically secure 的随机数生成金鑰,不要使用简单密码或可预测的字串。
为什么簽章驗證显示不匹配?
常见原因:1) 訊息包含额外空格或换行符;2) 平台簽章字串格式不同(如 Stripe 簽章的是 `timestamp.payload`);3) 簽章包含前缀需要去掉(如 GitHub 的 `sha256=`);4) 使用的演算法不同。检查加密端和解密端的参数是否完全一致。
HMAC 可以用于 JWT 簽章吗?
可以。JWT 的 HS256 演算法就是 HMAC-SHA256,HS512 是 HMAC-SHA512。本工具生成的 HMAC-SHA256 簽章可以直接用作 HS256 演算法的簽章内容。JWT 的 Header 和 Payload 是 Base64URL 编码,然后用 HS256 对整个内容簽章。
線上 HMAC 工具安全吗?
本工具使用 Web Crypto API 在瀏覽器本地完成所有计算,金鑰和訊息全程不发送到任何伺服器。可以在瀏覽器开发者工具的网络面板驗證,确认没有任何数据外传。适合测试和开发除錯,极度敏感的生产金鑰建议使用本地离线工具。
HMAC 簽章可以被伪造吗?
不能。HMAC 的安全性依赖于金鑰保密和哈希演算法的抗碰撞性。在金鑰足够长且随机的情况下,目前没有已知的攻击方法可以伪造有效的 HMAC 簽章。定期更换金鑰是良好的安全习惯。
- 安全字串比較
- 二進位轉換
- 凱薩密碼
- 摩斯密碼
- 十六進位轉換
- 影片轉 Base64
- Base64 轉影片
- 圖片轉 Base64
- Base64 轉圖片
- 文字轉 Base64
- Base64 轉文字
- 檔案雜湊校驗
- 檔案轉 Base64
- Base64 轉檔案
- 音訊轉Base64
- Base64轉音訊
- AES 加密解密
- DES 加密解密
- Base32 編碼解碼
- Base58 編碼解碼
- Base64 編碼
- Base64 解碼
- Base64 比較
- Base64 拆分
- Base64 多行合併
- Base64 格式化
- Base64 格式檢查
- Base64 批次編碼
- Base64 批次解碼
- Base64 清理
- Base64 填充處理
- Base64 長度統計
- Base64 轉十六進位
- Base64 DataURL 轉換
- Base64-Hex 互轉
- Base85 編解碼器
- HMAC 生成與驗證
- PBKDF2 金鑰派生
- MD5 雜湊
- SHA-256 雜湊
- SHA1 雜湊
- SHA512 雜湊
- JWT 工具
- HTML 實體編碼解碼
- Unicode 跳脫
- URL 編碼
- URL Safe Base64
- MIME Base64
- Java 混淆
- JS 混淆
- PHP 混淆
- Python 混淆