我有一个使用jsrsasign
和JWK格式密钥生成ECDSA签名的代码,生成一个连接(r-s)签名:
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字节的缓冲区,并且它们会进行交叉验证(即我可以使用SubtleCrypto
验证jsrsasign
的签名,反之亦然)。但是,当我在Node.js crypto
模块中使用Sign
类时,似乎得到的结果与这些有很大不同。
key = require('jwk-to-pem')(key, {'private': true});
const sign = require('crypto').createSign('sha256');
sign.update(dataBuffer);
return sign.sign(key);
在这里,我获取了一个可变长度的缓冲区,大约70个字节;它与 jsrsa
没有进行交叉验证(后者因 r-s 签名的无效长度而抛出错误)。
我如何使用 Node 的 crypto
获取由 jsrsasign
和 SubtleCrypto
生成的 r-s 签名?
require('jwk-to-pem')(key, {'private': true});
生成的是加密模块可以理解的 EC 私钥的有效编码吗?它是否以----- BEGIN EC PRIVATE KEY ------
开头,就像示例中一样? - Artjom B.