sistema - ¿Cómo crear un par de claves privadas/públicas usando Node.js crypto?
sistema operativo para node js (7)
Tengo que generar dos claves (privada y pública) para cifrar un texto con el público y dejar que el usuario con la clave privada descifre el texto.
¿Es posible con el módulo Crypto?
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 criptografía.
Me preocupa que si datos similares se cifraran directamente, sin un pase de AES o similar, entonces sería trivial 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 investigación adicional, http://en.wikipedia.org/w/index.php?title=RSA_%28cryptosystem%29§ion=12#Attacks_against_plain_RSA , parece que ursa ya tiene relleno.
No lo he usado, pero esto puede ser útil:
http://ox.no/posts/diffie-hellman-support-in-node-js
La documentación está muy ausente en esto (no hay ejemplos que pueda encontrar).
Puedes usar este módulo rsa-json . Simplemente genera un proceso openssl, por lo que es bastante dependiente del sistema operativo (no funciona de forma predeterminada en Windows).
Si sabe cómo obtener lo que desea de OpenSSL, creo que es perfectamente razonable ejecutar OpenSSL utilizando el child_process
de child_process
de 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();
});
Utilice el módulo criptográfico de npm para generar KeyPair.
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''));
Arriba hay un fragmento de ejemplo. Para saber más documentación de pago http://nodejs.org/api/crypto.html
child_process route es una solución imo terrible y no escalable. Mantente alejado.
Elegí ir con el keypair lugar.
nodejs v10.12 ahora admite esto de forma nativa con crypto.generateKeyPair
const { generateKeyPair } = require(''crypto''); generateKeyPair(''rsa'', { modulusLength: 4096, publicKeyEncoding: { type: ''spki'', format: ''pem'' }, privateKeyEncoding: { type: ''pkcs8'', format: ''pem'', cipher: ''aes-256-cbc'', passphrase: ''top secret'' } }, (err, publicKey, privateKey) => { // Handle errors and use the generated key pair. });