Cómo cifrar y descifrar de forma segura los archivos entre un servidor y una PC cliente [cerrado]

-1

Estoy creando una aplicación en la que los usuarios envían archivos con una contraseña para cifrarlos a un servidor a través de ssl. Luego pueden compartir los archivos cifrados con las personas

Luego construiré una aplicación de escritorio en C ++ donde un usuario puede seleccionar el archivo y descifrarlo localmente en su escritorio con una contraseña

Opción 1: PGP Lo primero que pensé fue usar pgp, ahora si almacenaba de forma segura un par de llaves privadas y públicas en el servidor, todos los archivos de los usuarios se podrían cifrar con la contraseña de los usuarios con la contraseña. Pero mi aplicación de escritorio no podrá descifrar el archivo con solo una contraseña. Tendría que incluir la clave privada en mi aplicación de escritorio.

Pregunta 1: si mi aplicación de escritorio está compilada, un atacante podría descompilar la aplicación y apoderarse de la clave privada. ¿Existe alguna manera de almacenar datos de forma segura en un programa compilado para evitar dicha violación?

Opción2: AES Otro método que pensé fue que utilizaba un algoritmo de hash para codificar la contraseña de los usuarios y luego utilizaba ese hash como clave para cifrar el archivo utilizando el cifrado AES. Luego, en mi aplicación de escritorio, uso el mismo algoritmo de hash para recrear la clave cuando el destinatario del archivo ingresa la contraseña para descifrar el archivo

Pregunta 2: el mismo problema, si un asistente descompila mi programa y ve qué algoritmo de hashing estoy usando de nuevo al cuadrado, ahora solo pueden generar hashes y fuerza bruta para abrir el archivo

Pregunta 3: ¿Alguien sabe de una mejor manera de implementar esto?

    
pregunta Dr Manhattan 20.08.2016 - 04:17
fuente

2 respuestas

1

Suponga que su aplicación cliente puede y será descompilada y no vaya con su primera opción de almacenar la clave privada. Sin tener en cuenta el potencial de descompilación, esta sería una mala práctica de todos modos, ya que estaría usando la misma clave para cada archivo.

En su lugar, use un algoritmo de cifrado sólido como AES y una función de derivación de clave basada en contraseña lenta (por ejemplo, PBKDF2). Si implementa esto bien (realice una investigación sobre los modos de cifrado de bloques, vectores de inicialización, sales e iteraciones), no importará si un atacante conoce el algoritmo. La fuerza residirá en la contraseña que no está (o al menos no debería estar) almacenada en ningún lugar. Implemente políticas de contraseña segura (por ejemplo, no permita contraseñas cortas y simples). ¡Buena suerte!

    
respondido por el Dude 20.08.2016 - 08:04
fuente
1

No estoy seguro de entender el caso de uso lo suficientemente bien, pero ¿ha considerado usar GPG (o similar) en modo simétrico? No te metas con los pares de teclas, solo frases de contraseña. Para el manual de GPG , el comando para cifrar usando cifrado simétrico solo es --symmetric o simplemente -c , y le pedirá la frase de contraseña. También puede especificar usar armadura ASCII, si eso sería útil. Descifre el blob resultante como de costumbre (solo se lo pasa a gpg sin otros argumentos) y le pedirá la frase de contraseña nuevamente para descifrar.

Hay muchas otras herramientas que cifrarán y descifrarán simétricamente los archivos, aunque algunas de ellas están muy mal diseñadas. En realidad, no he examinado específicamente qué tan bueno es el GPG, porque cualquiera que quiera enviar un archivo cifrado y que tenga GPG en sí mismo, solo uso el cifrado asimétrico. Sin embargo, si por alguna razón desea usar criptografía simétrica, usar un programa multiplataforma ya existente y confiable como GPG parece una buena idea.

    
respondido por el CBHacking 20.08.2016 - 06:54
fuente

Lea otras preguntas en las etiquetas