Por favor, tengan paciencia conmigo, ya que no soy un experto en seguridad. Tengo un servidor y un cliente. En el servidor, estoy cifrando un mensaje muy secreto (utilizando AES256-GCM para ocultar la información y proteger su integridad) que enviaré al cliente. Aunque el cliente nunca descifrará este mensaje, solo lo recibirá del servidor y lo enviará de vuelta al servidor con sus solicitudes. Mi servidor descifra y recibe el mensaje secreto que necesita para procesar otra información. Necesito asegurarme de que el cliente nunca sabrá de los contenidos dentro del mensaje. Estoy usando javascript (NodeJS) para mi código de servidor y se ve así (espero que sea fácil de leer y fácil de entender):
var crypto = require('crypto'); //get crypto library
var algorithm = 'aes-256-gcm'; // select which algorithm I want to use
var password = '3zTvzr3p67VC61jmV54rIYu1545x4TlY'; //Random generated 256bit key
function encrypt(text) {
var iv = crypto.randomBytes(128) // generate a random 128bit iv for every encryption
var cipher = crypto.createCipheriv(algorithm, password, iv)
var encrypted = cipher.update(text, 'utf8', 'hex')
encrypted += cipher.final('hex');
var tag = cipher.getAuthTag();
var enc = {
content: encrypted,
tag: tag.toString('hex')
};
sendToClientOverInternet(enc,iv); //send the encrypted content + the iv to client over the internet
}
function decrypt(encrypted) {
var decipher = crypto.createDecipheriv(algorithm, password, iv)
decipher.setAuthTag(new Buffer(encrypted.tag, 'hex'));
var dec = decipher.update(encrypted.content, 'hex', 'utf8')
dec += decipher.final('utf8');
return dec;
}
Me preocupan más los procesos y los métodos de encriptación que se oponen a la seguridad de la infraestructura. Con eso, podemos asumir que mi servidor es completamente seguro y que nunca se accederá a la contraseña codificada en mi código y que el transporte de datos a través de Internet se realiza a través de ssl.
Mi código con mis preguntas:
1) Primero, generé una clave global de 32 bytes de forma segura y aleatoria.
P: ¿Es este el tamaño correcto? ¿Alguna forma de mejorar la clave?
2) Tengo un método de cifrado que toma un poco de texto y lo cifra utilizando AES256-GCM. Luego toma este objeto cifrado y, junto con el iv (128 bit de seguridad generado aleatoriamente para cada mensaje) lo envía al cliente. El cliente, si lo deseaba, ahora podría ver este objeto cifrado y el iv.
P: ¿Es necesario proteger la integridad de los datos mediante GCM? Si utilizo CTR, ¿no sería imposible para el pirata informático descifrar y cambiar el mensaje de todas formas sin la clave? Entonces, ¿es GCM 'excesivo'? ¿Es seguro para el usuario enviar el iv y tenerlo accesible? ¿Es un 128 bit iv lo suficientemente largo? ¿Alguna gran mejora que pueda hacer aquí?
3) Tengo un método de descifrado que toma mi cadena cifrada y la descifra.
P: (No creo que se deba mejorar nada aquí).
Cualquier mejora o sugerencia sería muy apreciada.