2011-12-15 76 views
21

Tengo que generar dos claves (privadas y públicas) para encriptar un texto con el público y dejar que el usuario con la clave privada descifre el texto.¿Cómo crear un par de claves privadas/públicas usando Node.js crypto?

¿Es posible con el módulo Crypto?

¡Gracias!

+0

No estoy seguro de cómo va a dar a los usuarios sus claves privadas de forma segura. Sería mejor si generaran sus pares de claves localmente y les diera sus claves públicas. – Bruno

+1

@Bruno sí, no hay problema al respecto ... mi objetivo es comprender cómo crear un par de claves (privadas, públicas) con Node.js, ¿es esto posible? – Dail

Respuesta

5

Si sabe cómo obtener lo que desea de OpenSSL, creo que es perfectamente razonable ejecutar OpenSSL utilizando Node's child_process.

var cp = require('child_process') 
    , assert = require('assert') 
    ; 

var privateKey, publicKey; 
publicKey = ''; 
cp.exec('openssl genrsa 2048', function(err, stdout, stderr) { 
    assert.ok(!err); 
    privateKey = stdout; 
    console.log(privateKey); 
    makepub = cp.spawn('openssl', ['rsa', '-pubout']); 
    makepub.on('exit', function(code) { 
    assert.equal(code, 0); 
    console.log(publicKey); 
    }); 
    makepub.stdout.on('data', function(data) { 
    publicKey += data; 
    }); 
    makepub.stdout.setEncoding('ascii'); 
    makepub.stdin.write(privateKey); 
    makepub.stdin.end(); 
}); 
+3

Muy dependiente del sistema operativo en mi opinión. –

+0

Puede que no funcione en BeOS – kgilpin

+5

definitivamente no funcionará en mi amstrad no existente. – airtonix

0

Puede usar this rsa-json module. Simplemente genera un proceso openssl, por lo que es bastante dependiente del sistema operativo (no funciona por defecto en Windows).

1

child_process route es una solución terrible y no escalable imo. Mantente alejado.

Elegí ir con keypair en su lugar.

Saludos

+1

'keypair' es mucho más lento que OpenSSL y también es sincrónico, mientras que la ruta de OpenSSL es asincrónica. La ruta child_process es _más_ escalable. –

12

Use el módulo criptográfico de NPM para generar el par de claves.

var crypto = require('crypto'); 

var prime_length = 60; 
var diffHell = crypto.createDiffieHellman(prime_length); 

diffHell.generateKeys('base64'); 
console.log("Public Key : " ,diffHell.getPublicKey('base64')); 
console.log("Private Key : " ,diffHell.getPrivateKey('base64')); 

console.log("Public Key : " ,diffHell.getPublicKey('hex')); 
console.log("Private Key : " ,diffHell.getPrivateKey('hex')); 

Above es un fragmento de ejemplo. Para saber más documentación de pago http://nodejs.org/api/crypto.html

+1

Esta respuesta no abarca el cifrado y el descifrado. – fadedbee

+8

La pregunta no solicitó cifrado ni descifrado. Solo solicitó la generación de par de claves. Y el cifrado y descifrado está muy bien explicado en la documentación. – Aks

+4

Me gusta esto, pero ¿cómo obtener un par de claves con formato PEM con crypto? –

14

El siguiente código funciona, pero no soy un criptógrafo profesional, por lo que algunos comentarios aquí serían útiles.

He usado el módulo ursa RSA, en lugar de crypto.

Me preocupa que si se cifraron datos similares directamente, sin un pase de AES o similar, entonces podría ser trivial para romper esto. Comentarios Por favor ...

var ursa = require('ursa'); 
var fs = require('fs'); 

// create a pair of keys (a private key contains both keys...) 
var keys = ursa.generatePrivateKey(); 
console.log('keys:', keys); 

// reconstitute the private key from a base64 encoding 
var privPem = keys.toPrivatePem('base64'); 
console.log('privPem:', privPem); 

var priv = ursa.createPrivateKey(privPem, '', 'base64'); 

// make a public key, to be used for encryption 
var pubPem = keys.toPublicPem('base64'); 
console.log('pubPem:', pubPem); 

var pub = ursa.createPublicKey(pubPem, 'base64'); 

// encrypt, with the public key, then decrypt with the private 
var data = new Buffer('hello world'); 
console.log('data:', data); 

var enc = pub.encrypt(data); 
console.log('enc:', enc); 

var unenc = priv.decrypt(enc); 
console.log('unenc:', unenc); 

Después de una cierta investigación adicional http://en.wikipedia.org/w/index.php?title=RSA_%28cryptosystem%29&section=12#Attacks_against_plain_RSA parece que ya lo hace la Osa relleno.

+3

Chris: Su comentario en el código dice encriptar con privado y descifrar con público, pero el código hace lo contrario: encripta con público y descifra con privado. Cuando intento encriptar con private, pub.decrypt (enc) me dice que la función de descifrado en el pub no está definida. Alguna idea. Thx – HarleyDave

+0

La biblioteca de ursa parece estar un poco abandonada. – Pablo

Cuestiones relacionadas