gpt4 book ai didi

node.js - 无法使用 nodejs 加密签署文件

转载 作者:搜寻专家 更新时间:2023-11-01 00:30:04 25 4
gpt4 key购买 nike

我已经用 nodejs 加密创建了一个私钥,并想用这个 key 签署一个文件。我的代码如下:

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)

我知道这与 key 格式有关,但我不知道如何解决这个问题。谁能帮忙?

更新:我编辑了私钥以适应 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)

最佳答案

用于签署数据的 key 必须是有效的 PEM 编码私钥。 DH getPrivateKey() 函数不返回此格式的 key ,它返回裸私钥数据。

您的选择包括:

  • 通过 OpenSSL key 生成器实用程序或类似工具生成私钥

  • 使用第三方 Node 模块正确编码私钥,如 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);

关于node.js - 无法使用 nodejs 加密签署文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39696888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com