为何crypto.subtle无法生成带deriveKey用法的AES-GCM密钥?
AES-GCM密钥生成报错及派生问题解决
你这段代码会抛出错误:Cannot create a key using the specified key usages.
const a = async () => { const key = await window.crypto.subtle.generateKey( { name: 'AES-GCM', length: 256, }, true, ['encrypt', 'decrypt', 'deriveKey'], ); }; a();
你想生成可后续派生的密钥,但移除deriveKey用法后,后续派生时又出现了permission error错误,具体原因和解决方法如下:
为什么会出现密钥用法错误?
AES-GCM是对称加密算法,它的密钥本身不支持deriveKey这个用法。deriveKey是专门给密钥派生类算法(比如HKDF、PBKDF2这类用于从基础材料生成新密钥的算法)的密钥设计的,不属于加密用AES密钥的合法权限范围,所以浏览器Web Crypto API会直接判定非法并抛出错误。
怎么实现“派生AES密钥”的需求?
正确的流程是先创建一个专门用于密钥派生的基础密钥/材料,再用它派生最终的AES-GCM密钥,而不是直接给AES密钥加派生权限:
举个HKDF派生AES-GCM密钥的示例:
const deriveAESKey = async () => { // 生成HKDF专用的基础密钥(支持deriveKey用法) const baseDeriveKey = await window.crypto.subtle.generateKey( { name: 'HKDF' }, true, ['deriveKey'] ); // 用HKDF派生得到AES-GCM密钥 const aesGcmKey = await window.crypto.subtle.deriveKey( { name: 'HKDF', salt: window.crypto.getRandomValues(new Uint8Array(16)), info: new TextEncoder().encode('aes-gcm-derivation'), hash: 'SHA-256' }, baseDeriveKey, { name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt'] ); return aesGcmKey; }; deriveAESKey();
你之前移除deriveKey后派生报错,是因为AES密钥本身既没有派生权限,也不具备派生能力,根本不能作为派生操作的基础密钥,必须用HKDF、PBKDF2这类派生算法的密钥来完成这个流程。
内容的提问来源于stack exchange,提问作者jun li
相关产品推荐
相关产品推荐

