Estoy usando CryptoJs para cifrar archivos en el lado del cliente antes de subirlos a un servidor. El cifrado y el descifrado funcionan, pero mi pregunta es qué tan seguro es esto. En mi javascript, paso la 'frase de contraseña secreta' como argumento para la función de cifrado. Todo lo que estoy usando para descifrar es también la misma frase de contraseña. Entonces, si alguien puede hacerse con esta 'frase de contraseña secreta', ¿no pueden descifrar fácilmente los datos?

Crytpjs:

var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
0
Noob 12 ene. 2017 a las 21:26
Si alguien adquiriera la sal utilizada en el cifrado y supiera qué tipo de cifrado usó, podría descifrarlo, pero eso es lo mismo para todos los cifrados.
 – 
SaggingRufus
12 ene. 2017 a las 21:28
Si alguien tiene la llave de su casa, es posible que pueda entrar en ella, si puede encontrar la puerta.
 – 
Jonas Wilms
12 ene. 2017 a las 21:31
Tenga en cuenta que esta es la razón por la que es mejor que la sal tenga una cadena aleatoria de caracteres siempre que esté permitido.
 – 
SaggingRufus
12 ene. 2017 a las 21:32
¿Puedes dar más detalles con respecto a los cryptojs?
 – 
Noob
12 ene. 2017 a las 21:35
La frase secreta en este caso es la sal. Conviértalo en una cadena que nadie pueda adivinar, por lo que si trabaja para la Compañía X, usar "CompañíaX" como frase de contraseña no sería una buena idea. Haz una cadena al azar.
 – 
SaggingRufus
12 ene. 2017 a las 21:40

3 respuestas

Si su requisito es que los archivos cargados estén encriptados pero sean visibles para el servidor, realmente debería usar TLS. No hay razón para usar nada más.

Si su requisito es que los archivos cargados estén cifrados de manera que ni siquiera el servidor pueda descifrarlos, simplemente solicite una contraseña al usuario, aplique PBKDF2 y utilice el resultado como clave.

Si va a mantener su código actual, hay algunas cosas que debe cambiar. Por el momento, parece que está utilizando el modo ECB (no proporciona un IV). El modo ECB es inseguro y no debe utilizarse. Además, necesita una forma de asegurarse de que los datos no se hayan modificado en tránsito. Debe aplicar un HMAC y agregarlo al final.

2
Luke Joshua Park 12 ene. 2017 a las 23:54
Mi requisito es que el archivo esté encriptado antes de cargarlo. por lo que el cifrado del lado del cliente. Tampoco debería ser legible en el servidor. Desde el servidor, descifro y envío el archivo original a un repositorio.
 – 
Noob
13 ene. 2017 a las 00:47
1
Entonces ... ¿No debería ser visible en el servidor pero el servidor aún lo descifra? ¿Cuál es?
 – 
Luke Joshua Park
13 ene. 2017 a las 00:48
Honestamente, parece que solo necesitas TLS.
 – 
Luke Joshua Park
13 ene. 2017 a las 00:49

AES es un algoritmo simétrico para el cifrado. Significa que la clave (contraseña secreta) utilizada para cifrar y descifrar es la misma.

Por lo tanto, su seguridad se basa principalmente en mantener la clave segura. Si alguien obtiene la clave, podrá descifrar cualquier cosa cifrada con esa frase de contraseña.

Por lo general, recomiendo que, si los datos cifrados se van a compartir, comparta los datos en un canal (correo electrónico o servidor en la nube) y envíe la clave a través de un canal diferente (whatsapp, llamada telefónica, etc.).

0
adonike 12 ene. 2017 a las 21:34
Aunque no estoy enviando la clave junto con los datos, ya que esto es javascript, se puede encontrar fácilmente, ¿correcto? Quiero decir, en el navegador, si alguien hace F12, puede ver todos los valores en el script. Sigo enviando el objeto cifrado al servidor.
 – 
Noob
12 ene. 2017 a las 21:38
¡Correcto! Una forma de evitarlo podría ser dejar que el usuario escriba su clave antes de cifrar el archivo. Otra es generar una clave aleatoria y decirle al usuario que la anote.
 – 
adonike
12 ene. 2017 a las 22:47

Resuelto mediante el uso de ofuscación de JavaScript. Esta es una buena forma de enmascarar el contenido del script.

-2
Noob 4 feb. 2017 a las 00:28
Tenga en cuenta que la ofuscación, por definición, también es completamente reversible y no proporciona ningún nivel de seguridad .
 – 
Luke Joshua Park
6 feb. 2017 a las 02:12