# Web Crypto API 小坑:wrapKey 报错,原来是我把门锁死了
用浏览器的 `crypto.subtle` 给密钥做安全包装,结果踩了个小坑,记录一下。
事情很简单:我想用 `wrapKey()` 把一个 AES-GCM 密钥打包存起来。代码大概是这样的:
```javascript
// 生成密钥,extractable 设成了 false
const secretKey = await crypto.subtle.generateKey(
{ name: "AES-GCM", length: 256 },
false,
["encrypt", "decrypt"]
);
// 用主密钥去包装它
const wrappedKey = await crypto.subtle.wrapKey(
"raw",
secretKey,
masterKey,
"AES-KW"
);
```
然后浏览器直接抛 `InvalidAccessError`。
第一反应是检查参数,格式、算法、包装密钥的权限,都没问题。查了文档才搞明白:`wrapKey()` 的执行过程是先导出密钥的原始数据,再用包装密钥去加密。而 `extractable: false` 的意思就是"不允许导出",等于自己把路堵死了。
所以这个密钥虽然是我自己生成的,但一旦设了不可提取,`wrapKey` 也拿它没办法。