gpt4 book ai didi

javascript - Webcrypto PBKDF2-SHA1

转载 作者:行者123 更新时间:2023-12-04 10:03:48 31 4
gpt4 key购买 nike

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

const ENCODING = "utf-8";
const HMACSHA1 = {name: "HMAC", "hash" : "SHA-1"};
const PBKDF2SHA1 = {name: "PBKDF2", "hash": "SHA-1"};

// str2binb takes a string and outputs an ArrayBuffer

async function pbkdf2_generate_key_from_string(string) { // Working
return crypto.subtle.importKey(
"raw",
str2binb(string),
PBKDF2SHA1,
false,
["deriveKey", "deriveBits"],
);
}

async function pbkdf2_derive_salted_key(key, salt, iterations) { // Not working
return crypto.subtle.deriveKey(
{
"name": "PBKDF2",
"salt": salt,
"iterations": iterations,
"hash": "SHA-1",
"length": 160
},
key,
{
"name": "HMAC"
"hash": "SHA-1",
"length": 160
},
true,
[ "encrypt", "decrypt"]
);
}

但是我知道我一定是用错了,因为它是一种受支持的 key 派生算法,并且根据 Mozilla 的精彩文档,在 derivedKeyAlgorithm 下支持 HMAC 以及 HMAC-SHA1。我也让它与 AES-GCM 一起工作相当直接。

我收到的错误消息,当我尝试时,

salt = b64binb("QSXCR+Q6sek8bf92"); // ArrayBuffer
key = await pbkdf2_generate_key_from_string("pencil");
x = await pbkdf2_derive_salted_key(key, salt, 4096)

Uncaught DOMException: Cannot create a key using the specified key usages.
注意:我知道不再推荐 SHA1,这是为了旧版支持。

注 2:当我将上述内容替换为时,它会起作用,

async function pbkdf2_derive_salted_key(key, data, salt, iterations) {  // Not working
return crypto.subtle.deriveKey(
{
"name": "PBKDF2",
salt: salt,
"iterations": iterations,
"hash": "SHA-1",
},
key,
{
"name": "AES-GCM",
"length": 256
},
true,
[ "encrypt", "decrypt"]
);
}

谢谢你。

最佳答案

deriveKey ,参数keyUsages必须改为 ["sign", "verify"] .然后代码工作(因为 b64binbstr2binb 没有发布,以下代码使用适当的替代品):

const b64binb = base64String => Uint8Array.from(atob(base64String), c => c.charCodeAt(0));
const str2binb = str => new TextEncoder().encode(str);
const buf2hex = buffer => Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');

async function pbkdf2_generate_key_from_string(string) {
return crypto.subtle.importKey(
"raw",
str2binb(string),
{
name: "PBKDF2",
},
false,
["deriveKey", "deriveBits"],
);
}

async function pbkdf2_derive_salted_key(key, salt, iterations) {
return crypto.subtle.deriveKey(
{
name: "PBKDF2",
salt: salt,
iterations: iterations,
hash: {name: "SHA-1"}
},
key,
{
name: "HMAC",
hash: "SHA-1",
length: 160
},
true,
["sign", "verify"] // <--------------------- Fix!
);
}

async function test(){
salt = b64binb("QSXCR+Q6sek8bf92"); // ArrayBuffer
key = await pbkdf2_generate_key_from_string("pencil");
x = await pbkdf2_derive_salted_key(key, salt, 4096)

console.log(buf2hex(await window.crypto.subtle.exportKey("raw", x)));
}

test();


使用此 key , window.crypto.subtle.sign使用 HMAC-SHA1 创建签名。

更新:

自在 SubtleCrypto通常指定 key 的使用, ["encrypt", "decrypt"]必须申请为 keyUsages AES-GCM 和 ["sign", "verify"] 的参数对于 HMAC-SHA。

为什么 ["encrypt", "decrypt"]对于 AES-GCM? AES-GCM 用于 加密/解密留言: AES描述了 block cipher (允许加密单个块)和 GCM mode of operation (允许加密多个块)。 GCM 提供 secret 性、真实性和完整性。

为什么 ["sign", "verify"]对于 HMAC-SHA? HMAC 用于 签名/验证消息:某些操作模式,例如 CBC只提供保密。为了额外提供真实性和完整性,可以使用 MAC 对消息进行签名。 (例如 HMAC,它是基于 cryptographic hash function 的特定类型的 MAC,例如 SHA 系列之一)。 MAC 通常是根据密文而不是明文 ( Encrypt-then-MAC ) 计算的。关于SHA1漏洞,参见HMAC-SHA1和HMAC-SHA256的比较 herehere .

关于javascript - Webcrypto PBKDF2-SHA1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61691214/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com