Javascript 为什么可以';您不能使用WebCrypto派生HKDF密钥吗?

Javascript 为什么可以';您不能使用WebCrypto派生HKDF密钥吗?,javascript,cryptography,webcrypto-api,Javascript,Cryptography,Webcrypto Api,我想获取一个密码并通过PBKDF2运行它来创建一个主密钥。然后我想通过HKDF运行它来创建多个键。似乎crypto.微妙.deriveKey不会接受HKDF作为derivedKeyAlgorithm 换句话说,我不能让这样的东西工作 const kd_algo = { name: "PBKDF2", hash: "SHA-256", salt: pbkdf2_salt, iterations: 100000 } const master_key = awa

我想获取一个密码并通过PBKDF2运行它来创建一个主密钥。然后我想通过HKDF运行它来创建多个键。似乎
crypto.微妙.deriveKey
不会接受HKDF作为
derivedKeyAlgorithm

换句话说,我不能让这样的东西工作

const kd_algo = { name: "PBKDF2", hash: "SHA-256", salt: pbkdf2_salt, iterations: 100000 }
const master_key = await crypto.subtle.deriveKey(kd_algo, password, { name: "HKDF" }, false, ["deriveKey"])
但这会

const kd_algo = { name: "PBKDF2", hash: "SHA-256", salt: pbkdf2_salt, iterations: 1000000 }
const master_key_material = await crypto.subtle.deriveBits(kd_algo, password, 256)
const master_key = await crypto.subtle.importKey("raw", master_key_material, "HKDF", false, ["deriveKey"])

这没有任何意义。

您可以使用PBKDF2通过使用不同的盐来派生多个密钥。@kelalaka不是一个好主意,因为对手可能只需要运行PBKDF2一次,所以您可以毫无理由地进行额外的工作。将PBKDF2与SHA-512一起使用并在之后分割密钥更有意义。或使用PBKDF2代替HKDF。但在这两种情况下,你仍然会有一个中间值,所以它实际上解决不了多少问题。JS加密API通常被设计成毫无意义的,如果你问我,我没有看到任何合理的JS加密API的迹象。不幸的是,Afaik
deriveKey
基本上就是2。代码片段,即将数据从
deriveBits
(此处使用PBKDF2创建)传递到
importKey
,以派生密钥(此处使用HKDF)。但显然在步骤2中不支持HKDF,因为否则就必须有一个为HKDF定制的
derivedKeyAlgorithm
参数对象(类似于
HmacKeyGenParams
AesKeyGenParams
)。您可以将此作为问题提交。