You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:58:23