WebCrypto Создать подпись ECDSA в base64
Я хочу создать подпись ECDSA и преобразовать ее в base64.
Я легко могу сделать это с помощью Nodejs:
const sign = crypto.createSign('SHA256')
sign.update('part1')
sign.update('part2')
const signature = sign.sign(privateKey, 'base64')
Однако, когда я пытаюсь сделать то же самое с Javascript SubtleCrypto API, сгенерированная подпись недействительна при проверке с помощью Node Crypto. Вот мой код:
let signature = await window.crypto.subtle.sign(
{
name: "ECDSA",
hash: { name: "SHA-256" },
},
this.privateKey,
"part1"+"part2"
);
signature = new Uint8Array(signature);
const byteArray = new Uint8Array(signature);
let byteString = "";
for (let i = 0; i < byteArray.byteLength; i += 1) {
byteString += String.fromCharCode(byteArray[i]);
}
const b64Signature = window.btoa(byteString);
Что мне не хватает?
2 ответа
Разница в формате кодировки подписи. Видите, подписи ECDSA между Node.js и WebCrypto кажутся несовместимыми?
Вот несколько примеров того, как вы можете преобразовать подпись WebCrypto в NodeJS и обратно.
https://github.com/PexicVentures/webcrypto/blob/master/src/mechs/ec/crypto.ts#L62-L69https://github.com/PectiveVentures/webcrypto/blob/master/src/mechs/ec/crypto.ts#L84-L89
Вы повторно объявляете
signature
. Попробуйте сделать один
sign
.