【发布时间】:2019-01-11 12:15:48
【问题描述】:
我有一些 blob 数据,例如:
const buffer = Buffer.from('ACDFF12BA','hex');
我如何生成密钥以对其进行签名?
【问题讨论】:
标签: node.js cryptography digital-signature
我有一些 blob 数据,例如:
const buffer = Buffer.from('ACDFF12BA','hex');
我如何生成密钥以对其进行签名?
【问题讨论】:
标签: node.js cryptography digital-signature
一种方法是使用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 不可用时(例如在电子应用程序中),建议使用上述方法
【讨论】:
generateKeyPair 时遇到了问题,因此跟踪我的问题的解决方案有点有用。
pair.private 在日志中生成了什么?使用哪种签名算法来生成签名? update 期间对输入字符串执行的编码是什么?
-----BEGIN RSA PRIVATE KEY----- 开头,然后跟随编码为 base64 的密钥,然后以 ---END RSA PRIVATE KEY--- 关闭,当然这个密钥将存储在本地并且永远不会出现出来。