如何使用`crypto.subtle.deriveKey`指定HKDF的期望输出长度
如何使用
crypto.subtle.deriveKey指定HKDF的期望输出长度 嗨,这个问题我之前刚好踩过坑,其实解决方法很简单——你只需要在deriveKey的目标密钥算法配置里加上length字段,就能直接指定你想要的256位输出长度了,不用再绕弯子用deriveBits转一遍~
为什么原来的代码会生成512位密钥?
你之前的deriveKey调用没指定length参数时,Web Crypto的HKDF实现会默认使用你配置的HKDF哈希算法(也就是SHA-512)的输出长度作为密钥材料的长度,也就是512位(64字节)。哪怕你目标是HMAC-SHA256,它也会生成64字节的密钥(HMAC本身支持任意长度的密钥,但我们需要的是刚好256位,所以直接指定长度就好)。
修改后的完整代码
直接在目标HMAC的算法配置里加上length: 256即可:
const baseKey = await crypto.subtle.importKey('raw', new Uint8Array(32), { name: 'HKDF' }, false, ['deriveKey', 'deriveBits']) const salt = new Uint8Array(16) const info = new Uint8Array(8) // 直接用deriveKey指定256位长度的HMAC密钥 const hmacKey2 = await crypto.subtle.deriveKey( { name: 'HKDF', hash: 'SHA-512', salt: salt, info: info }, baseKey, // 关键:这里加上length:256,指定生成256位的密钥材料 { name: 'HMAC', hash: 'SHA-256', length: 256 }, true, ['sign'] ); const exported2 = new Uint8Array(await crypto.subtle.exportKey('raw', hmacKey2)); console.log(btoa(exported2)) // 现在这个结果会和你用deriveBits生成的exported1完全一致
原理说明
Web Crypto API中,HMAC算法的配置对象支持length参数,用于指定密钥的比特长度。当你在HKDF的deriveKey调用中传入这个参数时,HKDF会直接生成对应长度的密钥材料,然后封装成HMAC密钥,省去了中间deriveBits导出再importKey的步骤,完全符合你想用deriveKey直接完成需求的预期。
备注:内容来源于stack exchange,提问作者Sebastian S
相关产品推荐
相关产品推荐

