Cifrado en NodeJS

   Anteriormente explicaba en el blog un poco de lo que es la seguridad en cifrado DES, también hablaba de lo que es NodeJS, por lo que he decidido hacer esta entrada dedicada a la seguridad en nuestro servidor. El ejemplo que explicare esta hecho con el Framework ExpressJS, con unas modificaciones puede adaptarlo a cualquier entorno Node. Lo primero es crear una ruta de prueba en nuestro App, llamemos a esta ruta "encrypt", referenciamos en nuestro App.js (o cualquier nombre que hayamos seleccionado).
var cipher = require('./routes/crypto');
app.use('/crypto/', cipher);

   Ahora solo nos resta definir las funciones:
var crypto = require('crypto');
var algorithm = 'aes-256-ctr';
var password = 'd6F3Efeq';

var encrypt = function(texto){
 var cipher = crypto.createCipher(algorithm, password)
 var crypted = cipher.update(texto, 'utf8', 'hex')
  crypted += cipher.final('hex');
 return crypted;
}

var decrypt = function(texto){
 var decipher = crypto.createDecipher(algorithm, password)
 var decrypted = decipher.update(texto, 'hex', 'utf8')
  decrypted += decipher.final('utf8');
 return decrypted;
}

   El detalle de trabajar de esta forma es que no estamos utilizando Buffers, lo que implica que si enviamos una cadena demasiado larga (supongamos un JSON) nos cortara la cadena, ocasionando que el resultado esperado sea incorrecto, es cuando modificamos un poco las funciones:
var crypto = require('crypto');
var algorithm = 'aes-256-ctr';
var password = 'd6F3Efeq';

var encrypt = function(texto){
 var cipher = crypto.createCipher(algorithm, password);
  cipher = Buffer.concat([cipher.update(texto), cipher.final()]);
 return cipher;
}
 
var decrypt = function(texto){
 var decipher = crypto.createDecipher(algorithm, password);
  decipher = Buffer.concat([decipher.update(texto), decipher.final()]);
 return decipher;
}

   Pero ¿que pasa si quiero utilizar 2 algoritmos diferentes?, es cuando podemos jugar con los parámetros y hacer algo como esto:
var express = require('express');
var router = express.Router();
var crypto = require('crypto');
var secretKey = new Buffer("d6F3Efeq");

var getCipher = function(algoritmo) {
 switch(algoritmo){
  case 'aes':
   return crypto.createCipher('aes-256-ctr', secretKey);  
   break;    
  case 'des':
   return crypto.createCipher('des-ede3-cbc', secretKey);
   break;
  default:
   return 'undefined';
 }
};
  
var getDecipher = function(algoritmo) {
 switch(algoritmo){
  case 'aes':
   return crypto.createDecipher('aes-256-ctr', secretKey);
   break;
  case 'des':
   return crypto.createDecipher('des-ede3-cbc', secretKey);
   break;
  default:
   return 'undefined';
   break;
 }
};

router.all('/:metodo/:algoritmo/:string', function(req, res, next) {
 var texto = req.params.string,
  metodo = req.params.metodo,
  algoritmo = req.params.algoritmo;
  
 switch(metodo){
  case 'encrypt':
   var cipher = getCipher(algoritmo);
    cipher = Buffer.concat([cipher.update(texto), cipher.final()]).toString('hex');
   break;
   
  case 'decrypt':
   var decipher = getDecipher(algoritmo);
    decipher = Buffer.concat([decipher.update(texto), decipher.final()]).toString('utf8');
   break;
 }
});

router.get('/', function(req, res, next) {
 res.render('index', { title: 'Carlitox en la Web', page: 'Cipher' });
});

module.exports = router;

   Ya solo nos queda hacer las siguientes llamadas:
/crypto/encrypt/des/HolaMundo
/crypto/decrypt/des/CadenaCifrada
/crypto/encrypt/aes/HolaMundo
/crypto/decrypt/aes/CadenaCifrada
 


Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión