我有用於使用jsrsasign
的ECDSA簽名和在JWK格式的密鑰產生一個級聯(R-S)碼簽名:用的Node.js /加密生成ECDSA簽名
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
,反之亦然)。但是,當我在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簽名的無效長度)。
如何獲得由jsrsasign
和SubtleCrypto
生成的r-s簽名,使用節點crypto
?
你確定'要求( 'JWK到PEM')(鍵,{ '私人' :true});'產生加密模塊可以理解的EC私鑰的有效編碼?它是否以'----- BEGIN EC PRIVATE KEY ------'開頭,如[示例](https://nodejs.org/api/crypto.html#crypto_class_sign)中的? –
是的:至少,它確實生成一個帶有「EC PRIVATE KEY」部分的PEM字符串,並且'crypto'模塊不會發出任何類型的錯誤或警告,它只是發出與我預期不同的簽名。 –