it-swarm-pt.tech

Como criar um par de chaves públicas / privadas usando a criptografia Node.js.

Eu tenho que gerar duas chaves (privadas e públicas) para criptografar um texto com o público e permitir que o usuário com a chave privada descriptografe o texto.

É possível com o módulo Crypto?

34
Dail

o nodejs v10.12 agora suporta isso nativamente com 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.
});
22
Nelson Owalo

Use o módulo de criptografia do npm para gerar o 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'));

Acima está um exemplo de trecho. Para saber mais sobre a documentação do checkout http://nodejs.org/api/crypto.html

20
Aks

O código a seguir funciona, mas eu não sou um criptógrafo profissional, portanto, alguns comentários aqui seriam úteis.

Eu usei o módulo ursa RSA, em vez de criptografia.

Estou preocupado que se dados semelhantes foram criptografados diretamente, sem um passe do AES ou similar, pode ser trivial quebrar isso. Comentários 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);

Após alguma investigação adicional http://en.wikipedia.org/w/index.php?title=RSA_%28cryptosystem%29&section=12#Attacks_against_plain_RSA parece que a ursa já está preenchida.

15
fadedbee

Se você sabe como obter o que deseja do OpenSSL, acho perfeitamente razoável executar o OpenSSL usando o Node 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();  
});
8
kgilpin

Você pode usar este módulo rsa-json . Ele apenas gera um processo openssl, por isso é bastante dependente do sistema operacional (ele não funciona por padrão no Windows).

0
Guido

Eu não o usei, mas isso pode ser útil:

http://ox.no/posts/diffie-hellman-support-in-node-js

Falta severamente documentação (não há exemplos que eu possa encontrar).

0
Steve Campbell

a rota child_process é uma solução terrível e não escalável imo. Ficar longe.

Eu escolhi ir com keypair em vez disso.

0
redditmerc