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);

Что мне не хватает?


person Mohammed Abo-zaid    schedule 02.07.2021    source источник


Ответы (1)


Разница заключается в формате кодировки подписи. См. подписи ECDSA между Node.js и WebCrypto появляются быть несовместимым?

Вот несколько примеров того, как вы можете преобразовать подпись WebCrypto в NodeJS и обратно.

https://github.com/PeculiarVentures/webcrypto/blob/master/src/mechs/ec/crypto.ts#L62-L69 https://github.com/PeculiarVentures/webcrypto/blob/master/src/mechs/ec/crypto.ts#L84-L89

person Microshine    schedule 22.07.2021