我有以下Node.js代码:
let jwktopem = require('jwk-to-pem');
let crypto = require('crypto');
let key = jwktopem({
crv: 'P-256',
kty: 'EC',
use: 'sig',
x: Buffer.from('8E54B421A5B51D7A5089D69E140B9ABA3FF46D9E0F16614F9A658E49E584F539', 'hex').toString('base64'),
y: Buffer.from('BB20BECA0B53E6CF3263226E056A0F77050AB428C10EB3B2B7E92E5D7328FC7E', 'hex').toString('base64'),
d: Buffer.from('9963F284D16B0096F40A6153895903CAF60EEB3CA90EA4FC6AAD3512486E9790', 'hex').toString('base64'),
kid: '1'
}, {private: true})
let message = Buffer.from('oSThaT8Kriu5Pzey6bQgCd/Ynwtpxl1PLeE+0i751Ok=', 'base64');
function signIt() {
const sign = crypto.createSign('SHA256');
sign.update(message);
console.log(sign.sign(key, 'hex'));
}
for (let i = 0; i < 10; i++) {
signIt();
}
我基本上用相同的密钥签署相同的消息10次,使用椭圆曲线加密。但我得到10个不同的结果!这是怎么回事?
答案 0 :(得分:0)
ECDSA签名算法涉及用于此目的的随机数,生成唯一的不可逆签名。见https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm
随机质量对签名的安全性至关重要。