当前位置: 首页 > 面试题库 >

无法使用Node.js crypto对文件签名

韦德厚
2023-03-14
问题内容

我用nodejs crypto创建了一个私钥,并想用该密钥签名文件。我的代码如下:

var ecdh = crypto.createECDH('brainpoolP512t1');
        ecdh.generateKeys();
        var key = ecdh.getPrivateKey('buffer');

        var data= fs.readFileSync(req.file.path);
        var sign = crypto.createSign('sha512');
        sign.update(data);
        var signature = sign.sign(key, 'hex');

但是我得到了错误:

Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
    at Error (native)
    at Sign.sign (crypto.js:283:26)
    at /....js:32:27
    at Immediate.<anonymous> (/.../node_modules/multer/lib/make-middleware.js:52:37)
    at runCallback (timers.js:578:20)
    at tryOnImmediate (timers.js:554:5)
    at processImmediate [as _immediateCallback] (timers.js:533:5)

我知道它与密钥格式有关,但我不知道该如何解决。有人可以帮忙吗?

更新:我编辑了privateKey以适合pem格式:

var KEY_START = '-----BEGIN EC PRIVATE KEY-----\n';
var KEY_END = '\n-----END EC PRIVATE KEY-----';

const ecdh = crypto.createECDH('brainpoolP512t1');
            ecdh.generateKeys();
            var key =KEY_START + ecdh.getPrivateKey('base64') + KEY_END;        
            var data= fs.readFileSync(req.file.path);
            const sign = crypto.createSign('sha512');
            sign.update(data);
            var signature = sign.sign(key, 'hex');

现在我遇到了另一个错误:

Error: error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long
    at Error (native)
    at Sign.sign (crypto.js:283:26)
    at /...js:37:27
    at Immediate.<anonymous> (/.../node_modules/multer/lib/make-middleware.js:52:37)
    at runCallback (timers.js:578:20)
    at tryOnImmediate (timers.js:554:5)
    at processImmediate [as _immediateCallback] (timers.js:533:5)

问题答案:

用于签署数据的密钥必须是有效的PEM编码的私钥。DH getPrivateKey()函数不以这种格式返回密钥,而是返回裸机专用密钥数据。

您的选择包括:

  • 通过OpenSSL密钥生成器实用程序或类似工具生成私钥
  • 使用第三方节点模块正确编码私钥,如RFC 5915中所述。使用asn1.jsbn.js模块的完整示例:
        var crypto = require('crypto');

    var asn1 = require('asn1.js');
    var BN = require('bn.js');

    function toOIDArray(oid) {
      return oid.split('.').map(function(s) {
        return parseInt(s, 10)
      });
    }

    // Define ECPrivateKey from RFC 5915
    var ECPrivateKey = asn1.define('ECPrivateKey', function() {
      this.seq().obj(
        this.key('version').int(),
        this.key('privateKey').octstr(),
        this.key('parameters').explicit(0).objid().optional(),
        this.key('publicKey').explicit(1).bitstr().optional()
      );
    });

    // Generate the DH keys
    var ecdh = crypto.createECDH('brainpoolP512t1');
    ecdh.generateKeys();

    // Generate the PEM-encoded private key
    var pemKey = ECPrivateKey.encode({
      version: new BN(1),
      privateKey: ecdh.getPrivateKey(),
      // OID for brainpoolP512t1
      parameters: toOIDArray('1.3.36.3.3.2.8.1.1.14')
    }, 'pem', { label: 'EC PRIVATE KEY' });

    // Sign data
    var sign = crypto.createSign('sha512');
    sign.update('hello world');
    var signature = sign.sign(pemKey, 'hex');

    console.log('signature', signature);


 类似资料:
  • 我正试图上传一个媒体文件(图片,任何扩展名jpg/png/jpeg或视频)到aws s3桶,从邮递员我创建了我的预签名url在我的后端如下 这成功地生成了一个url,但我似乎无法使用postman来测试它,这是我如何在postman中调整请求的截图 我所尝试的: 在上面的代码中,我尝试将签名版本v4添加到params中,但它给了我一个错误,说出了意外的关键字。我甚至尝试将其添加到aws配置和s3中

  • 有没有办法使用openssl对x509证书或任何文档进行数字签名?

  • 我正在尝试使用邮差上传一个文件。我已经通过点击“body”(在postman中)->二进制->选择文件附加了文件。我使用S3上载预签名的URL。在url中,文件的名称与我在Postman中选择的文件的名称完全相同。运行请求时,我得到一个错误: 但是,通过导出postman请求(通过单击“Code”)来获得curl命令,我得到了: 并添加一个用于上载文件的附加选项:

  • 我在nodejs中有一个非常小的代码,我在其中签名一个字符串,然后尝试使用openssl生成的节点密码和密钥对来验证它。无论我尝试什么,结果总是“错误”,签名无法验证。 生成公钥/私钥对: 生成的密钥是(我不在乎是否公开): 然后,这是我的节点代码: 我尝试使用不同的算法和编码。我已经读了带有"fs"的PEM文件,也没有运气。我错过了什么?顺便说一句,这些键使用npm URSA模块完美工作,所以我

  • 我正在使用瑞士电信数字签名服务,我们有一个测试帐户。服务需要散列码pdf文件。我们把它和 数字签名(PKCS#7-延迟签名)/自应用签名以来文档已被更改或损坏 我的回应是sha256被加密了。我正在使用iText和C#来签署pdf文件。我签字,我看到一些细节(如原因,地点等)。 下面是创建带有签名字段的pdf文件的方法 我错过了什么或者做错了什么?

  • 我得到了两个加密的文件。enc和加密的_数据。csv。附件。我需要使用我的私钥来解密加密的密钥。enc获取对称密钥,然后使用该对称密钥解密加密的_数据。csv。enc文件。 在终端上,以下命令完成作业: 我的目标是执行两个命令的java等效。我成功地解密了第一个文件并检索了对称密钥。 现在我无法使用对称密钥解密csv文件。我的问题出现在