Javascript Webcrypto PBKDF2-SHA1

Javascript Webcrypto PBKDF2-SHA1,javascript,cryptography,pbkdf2,hmacsha1,webcrypto,Javascript,Cryptography,Pbkdf2,Hmacsha1,Webcrypto,我在Webcrypto中使用PBKDF2时遇到问题。我想将PBKDF2与SHA-1算法一起使用。现在我有, const ENCODING=“utf-8”; 常量HMACSHA1={name:“HMAC”,“hash:“SHA-1”}; const PBKDF2SHA1={name:“PBKDF2”,“hash:“SHA-1”}; //str2binb接受一个字符串并输出一个ArrayBuffer 异步函数pbkdf2_从_字符串(字符串){//生成_键 返回crypto.minute.impor

我在Webcrypto中使用PBKDF2时遇到问题。我想将PBKDF2与SHA-1算法一起使用。现在我有,

const ENCODING=“utf-8”;
常量HMACSHA1={name:“HMAC”,“hash:“SHA-1”};
const PBKDF2SHA1={name:“PBKDF2”,“hash:“SHA-1”};
//str2binb接受一个字符串并输出一个ArrayBuffer
异步函数pbkdf2_从_字符串(字符串){//生成_键
返回crypto.minute.importKey(
“生的”,
str2binb(字符串),
PBKDF2SHA1,
假,,
[“deriveKey”、“deriveBits”],
);
}
异步函数pbkdf2_派生_salt_键(键、盐、迭代){//不工作
返回crypto.minute.deriveKey(
{
“名称”:“PBKDF2”,
“盐”:盐,
“迭代”:迭代,
“散列”:“SHA-1”,
“长度”:160
},
钥匙
{
“名称”:“HMAC”
“散列”:“SHA-1”,
“长度”:160
},
是的,
[“加密”、“解密”]
);
}
但是我知道我一定是用错了,因为它是一种受支持的密钥派生算法,而且根据Mozilla的奇妙文档,在
derivedKeyAlgorithm
HMAC下,HMAC和HMAC-SHA1都受支持。我还让它相当直接地与AES-GCM一起工作

我尝试时收到的错误消息

salt=b64binb(“QSXCR+Q6sek8bf92”);//阵列缓冲器
key=等待pbkdf2_从_字符串(“铅笔”)生成_key_;
x=等待pbkdf2_派生_盐渍_键(键,盐渍,4096)
is
Uncaught DomeException:无法使用指定的密钥用法创建密钥。

注意:我知道不再建议使用SHA1,这是为了旧版支持

注2:当我用

异步函数pbkdf2_派生_salt_键(键、数据、盐、迭代){//不工作
返回crypto.minute.deriveKey(
{
“名称”:“PBKDF2”,
盐:盐,
“迭代”:迭代,
“散列”:“SHA-1”,
},
钥匙
{
“名称”:“AES-GCM”,
“长度”:256
},
是的,
[“加密”、“解密”]
);
}

谢谢。

deriveKey
中,参数
keyUsages
必须更改为
[“签名”、“验证”]
。然后代码开始工作(由于未发布
b64binb
str2binb
,以下代码使用了适当的替代品):

const b64binb=base64String=>Uint8Array.from(atob(base64String),c=>c.charCodeAt(0));
const str2binb=str=>newtextcoder().encode(str);
const buf2hex=buffer=>Array.prototype.map.call(新的Uint8Array(buffer),x=>('00'+x.toString(16)).slice(-2)).join(“”);
异步函数pbkdf2_从_字符串(字符串){
返回crypto.minute.importKey(
“生的”,
str2binb(字符串),
{
名称:“PBKDF2”,
},
假,,
[“deriveKey”、“deriveBits”],
);
}
异步函数pbkdf2_派生_salt_键(键,salt,迭代){
返回crypto.minute.deriveKey(
{
名称:“PBKDF2”,
盐:盐,
迭代:迭代,
散列:{name:“SHA-1”}
},
钥匙
{
名称:“HMAC”,
散列:“SHA-1”,
长度:160
},
是的,

[“签名”,“验证”]//谢谢!我刚刚运行了它,它可以工作。如果你有时间做另一个问题lol,为什么它会在
AES-GCM
HMAC-SHA1
之间变化?@Justin-AES-GCM用于加密/解密,HMAC-SHA用于签名/验证,请参阅我答案中的更新部分。谢谢!@Topaco