javascript 为什么crypto. subject不能使用deriveKey生成AES-GCM密钥?

mccptt67  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(128)

下面的代码将抛出错误:

无法使用指定的密钥用法创建密钥。

const a = async () => {
  const key = await window.crypto.subtle.generateKey(
     {
      name: 'AES-GCM',
      length: 256,
     },
     true,
     ['encrypt', 'decrypt', 'deriveKey'],
   );
 };
a();

为什么会发生这种情况,我确实想生成一个密钥,以后可以派生出来。
我试图删除deriveKey用法,但后来在派生它时,permission error抛出。

jgovgodb

jgovgodb1#

“我确实想生成一个可以在以后派生的密钥。“
这并不意味着什么。你要么现在创建一个密钥,要么以后从“主密钥”派生它。此外,AES GCM不能用于密钥派生。"DeriveKey"是生成的密钥可以用于的东西,而不是密钥本身的属性。
你可以在这里看到你可以使用哪些算法来派生。然而,一个是用于密钥协商的,一个是用于基于口令的密钥派生的,似乎只有HKDF适合你的需要;如果你有一个对称密钥,你想从它派生另一个密钥,那么你应该使用HKDF。
您可以使用DeriveKey,将HkdfParams作为第一个参数,将"raw"键作为第二个参数(等等)。不幸的是,没有官方的HKDF示例(但我的bug报告可能会被接受,所以嘿,可能很快)。
Topaco写了一个很好的答案,其中包括HKDF here的代码;别忘了投赞成票。

相关问题