2016-09-26 4 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) 

나는 키 형식 함께 할 수있는 뭔가가 알고 있지만, 나는이 문제를 해결하는 방법을 모르겠어요. 누구든지 도와 줄 수 있습니까?

업데이트 : 나는 PEM 형식에 맞게 PrivateKey의 편집 :

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 :

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() 함수는이 형식의 키를 반환하지 않고 노출 된 개인 키 데이터를 반환합니다.

옵션은 다음을 포함한다 :

  • 에는 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); 
    
+0

나는 내가 서명 할 파일의 파일 경로가 서해야한다고 생각? – nolags

+0

내가 잘못 입력 했으므로 답변을 업데이트했습니다. – mscdex

+0

이제 DH 개인 키에서 유효한 PEM 형식의 키를 (노드 내에서) 생성하려면 코드 예제를 추가했습니다. – mscdex