У меня есть код, который генерирует конкатенированную (rs) подпись для подписи ECDSA, используя jsrsasign
и ключ в формате JWK:
const sig = new Signature({ alg: 'SHA256withECDSA' });
sig.init(KEYUTIL.getKey(key));
sig.updateHex(dataBuffer.toString('hex'));
const asn1hexSig = sig.sign();
const concatSig = ECDSA.asn1SigToConcatSig(asn1hexSig);
return new Buffer(concatSig, 'hex');
Кажется, работает. У меня также есть код, который использует SubtleCrypto
для достижения того же самого:
importEcdsaKey(key, 'sign') // importKey JWK -> raw
.then((privateKey) => subtle.sign(
{ name: 'ECDSA', hash: {name: 'SHA-256'} },
privateKey,
dataBuffer
))
Оба они возвращают 128-байтовые буферы; и они выполняют перекрестную проверку (т. е. я могу проверить jsrsasign
подписи с SubtleCrypto
и наоборот). Однако, когда я использую класс Sign
в модуле Node.js crypto
, я получаю совсем другое.
key = require('jwk-to-pem')(key, {'private': true});
const sign = require('crypto').createSign('sha256');
sign.update(dataBuffer);
return sign.sign(key);
Здесь я получаю буфер переменной длины, примерно 70 байт; он не выполняет перекрестную проверку с jsrsa
(что исключает жалобу на недопустимую длину подписи rs).
Как я могу получить подпись r-s, сгенерированную jsrsasign
и SubtleCrypto
, используя узел crypto
?
require('jwk-to-pem')(key, {'private': true});
создает действительную кодировку закрытого ключа EC, которую понимает криптомодуль? Начинается ли он с----- BEGIN EC PRIVATE KEY ------
, как в примере? - person Artjom B.   schedule 14.09.2016EC PRIVATE KEY
, а модульcrypto
не выдает никаких ошибок или предупреждений, он просто выдает подпись, отличную от той, которую я ожидал. - person Petter Häggholm   schedule 15.09.2016