2016-09-26 15 views
1

私はnodejs暗号で秘密鍵を作成しました。この鍵でファイルに署名したいと思います。 私のコードは以下の通りです:nodejs暗号でファイルに署名できません

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) 

私はそれがキーの形式とは何かを持っているけど、私はこの問題を解決する方法がわかりません。誰も助けることができますか?

UPDATE:

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'); 

そして今、私は別のエラーgeht: 私はPEM形式に合わせてのPrivateKeyを編集し、あなたがする必要がでデータに署名

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) 

答えて

3

キーを有効なPEMエンコードされた秘密鍵。 DH getPrivateKey()関数は、この形式のキーを返さず、そのままの秘密鍵データを返します。

のオプションがあります。

  • は適切RFC 5915に概説された秘密鍵をエンコードするために、サードパーティのノードモジュールを使用したOpenSSLキージェネレータユーティリティまたは類似の
  • を経由して秘密鍵を生成します。全例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); 
    
+0

は私が署名するファイルのファイルパスをそこに立つべきと思いましたか? – nolags

+0

私は間違い、私は私の答えを更新しました。 – mscdex

+0

これで、DH秘密鍵から有効なPEM形式のキーを(ノード内で)生成する場合のコード例を追加しました。 – mscdex

関連する問題