功能说明
HKDF 可以从共享密钥派生多个用途不同的密钥,避免直接复用同一密钥。该函数使用 HKDF-SHA-256、显式盐和 info 上下文,派生 AES-GCM 密钥或指定长度的原始字节。相同输入会得到相同派生结果,因此盐与上下文必须稳定保存,不能每次随机变化。
关键代码
deriveAesKey 先把 secret 导入为 HKDF 原始密钥,再调用 deriveKey 指定 SHA-256、盐、info 与 AES-GCM 256 位参数。deriveBytes 使用 deriveBits 并返回 Uint8Array。两个函数都校验 secret 非空、盐为 Uint8Array、info 为字符串。
return crypto.subtle.deriveKey(
{ name: "HKDF", hash: "SHA-256", salt, info: new TextEncoder().encode(info) },
material,
{ name: "AES-GCM", length: 256 },
false,
["encrypt", "decrypt"],
);
使用注意
盐应随机且与派生结果一起保存,info 用于区分用途但不能当作秘密。相同 secret、salt 和 info 会得到相同密钥。派生的 AES 密钥不可导出,适合直接用于加解密。该函数不负责生成、存储或轮换 secret。派生长度上限为 255 字节。
验证方式
断言相同参数两次派生出的 AES 密钥可以互相解密对方加密的数据。修改 info 后派生密钥不同,无法解密原数据。空 secret 抛 TypeError,length 为 0 抛 RangeError。deriveBytes 指定 16 字节时返回长度 16,盐类型错误抛 TypeError。