【问题标题】:Nodejs Generate a keys to sign a piece of dataNodejs 生成一个密钥来签署一条数据
【发布时间】:2019-01-11 12:15:48
【问题描述】:

我有一些 blob 数据,例如:

const buffer = Buffer.from('ACDFF12BA','hex');

我如何生成密钥以对其进行签名?

【问题讨论】:

    标签: node.js cryptography digital-signature


    【解决方案1】:

    一种方法是使用keypair npm 包:

    const keypair = require('keypair');
    const crypto = require('crypto');
    
    const pair = keypair();
    
    // Create Transmitted Signature
    const sign = crypto.createSign('RSA-SHA256');
    sign.update('abcdef');  // data from your file would go here
    const sig = sign.sign(pair.private, 'hex');
    console.log(sig);
    
    // Verifying Signature
    const verify = crypto.createVerify('RSA-SHA256');
    verify.write('abcdef');
    verify.end();
    console.log(verify.verify(pair.public, sig,'hex'));
    

    如您所见,使用keypair() 函数我通过sign.sign 生成公钥和私钥我生成签名。请记住使用私钥签名。生成的公钥格式如下:

    --- RSA BEGIN PUBLIC KEY ---
    ^some base64 here^
    --- RSA END PUBLIC KEY ---
    

    并且生成的私钥将具有相同的格式:

    --- RSA BEGIN PRIVATE KEY ---
    ^some base64 here^
    --- RSA END PRIVATE KEY ---
    

    现在唯一要做的就是将缓冲区字符串化为十六进制字符串并完成这项工作。请记住,接收端也需要将数据验证为十六进制字符串。

    我们可以使用verify.verify 和公钥来验证签名。还要记住签名的格式。如果您生成十六进制编码的签名,请以相同的格式对其进行验证。

    当本机 crypto.generateKeyPair 不可用时(例如在电子应用程序中),建议使用上述方法

    【讨论】:

    • 生成密钥对通常不是大问题;建立对公钥的信任是,这就是为什么通常需要设置PKI。仅当您无法处理二进制数据时才需要字符串化;在我看来,它的方式执行得太频繁了。
    • 好吧,我在电子应用程序上使用本机 generateKeyPair 时遇到了问题,因此跟踪我的问题的解决方案有点有用。
    • 我认为每个包含 RSA 功能的库都具有生成密钥对的功能 - 通常带有示例代码。因此,老实说,我非常想将其关闭为过于宽泛或要求提供示例。问题也在于同行评审的形式很少。仅仅创建代码 sn-ps 以允许轻松复制是非常危险的。我不得不对许多代码 sn-ps 发出警告。
    • pair.private 在日志中生成了什么?使用哪种签名算法来生成签名? update 期间对输入字符串执行的编码是什么?
    • 一个 RSA 编码的密钥,就像在 ssh 中使用的一样,以 -----BEGIN RSA PRIVATE KEY----- 开头,然后跟随编码为 base64 的密钥,然后以 ---END RSA PRIVATE KEY--- 关闭,当然这个密钥将存储在本地并且永远不会出现出来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2010-09-08
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2012-04-09
    相关资源
    最近更新 更多