node.js - 为什么 Node.js crypto.sign 函数是不确定的?

标签 node.js sign elliptic-curve

我有以下一段 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();
}

基本上,我使用椭圆曲线加密技术使用相同的 key 对相同的消息签名 10 次。但是我得到了 10 个不同的结果!这是怎么回事?

最佳答案

ECDSA签名算法正是为此引入了随机数,生成唯一的不可逆签名。参见 https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm

随机数的质量对于签名的安全性至关重要。

关于node.js - 为什么 Node.js crypto.sign 函数是不确定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48565865/

相关文章:

java - Bouncy CaSTLe ECC Key Pair Generation为EC公钥点坐标生成不同大小

ios - ECC Curve25519 钥匙串(keychain)

javascript - async/await 不适用于 promisify

digital-signature - GPG 仍然看到了良好的迹象,撤销的子 key 仍然有效

c++ - 符号性的线性插值优化

gnupg - debgsig-verify 失败,gpg : no valid OpenPGP data found while gpg decrypt can verify the detached signature

c# - 将 key 导入到 Azure Key Vault (C#)

javascript - 查看函数的定义位置

node.js - Node.js 中错误消息中给出的数字

sql - TypeORM - 如何删除最后添加的行?