HTML5需借助Web Crypto API或第三方库实现HMAC消息认证,关键包括密钥安全分发、统一UTF-8编码与规范化签名原文构造、前后端哈希算法及密钥预处理逻辑严格对齐。
HTML5本身不内置HMAC算法,但可通过JavaScript调用标准加密库(如Web Crypto API或第三方库)结合HMAC实现端到端的消息认证。关键在于密钥安全保管、哈希函数选型、数据标准化处理,以及前后端协同验证逻辑。
现代浏览器普遍支持Web Crypto API,它提供标准化、安全的HMAC计算能力,无需引入外部依赖:
crypto.subtle.importKey()将密钥导入为JsonWebKey格式,类型设为"raw",算法指定{ name: "HMAC", hash: "SHA-256" }
crypto.subtle.sign()生成HMAC值,输入为UTF-8编码后的消息(需先用new TextEncoder().encode(message)转换)HMAC对输入字节流敏感,前后端若对消息的编码、截断、序列化方式不一致,会导致验签失败:
JSON.stringify(),再去除空格(避免换行/缩进差异)key=value,用&连接(类似OAuth 1.0a),避免JSON键序不确定性unescape或encodeURI等非标准编码HTML5环境缺乏服务端隔离能力,密钥管理和签名过程易被逆向或劫持:
session_key,前端仅用其生成单次HMAC
rce Integrity(SRI)校验所引用的加密库完整性,防止CDN劫持篡改crypto-js等第三方脚本前端生成的HMAC必须能被后端无歧义还原验证,双方需同步以下细节:
javax.crypto.Mac、Node.js的crypto.createHmac)而非手写实现,降低偏差风险