Almacenamiento de archivos cifrados. ¿Cómo simplificar el esquema de gestión de contraseñas?

4

Es probable que esté duplicado, pero no puedo averiguar las palabras clave correctas para la búsqueda. Puedes ayudar simplemente diciéndome esas palabras, soy bastante bueno con Google :)

Quiero desarrollar algo así como el almacenamiento de archivos con cifrado de cada archivo. Solo hay un usuario y todos los datos (y el código) se almacenan en su máquina local. El usuario puede importar algunos archivos y leer los que se importaron anteriormente.

Requisitos

El vector de ataque principal es lectura de datos no autorizada . No es necesario protegerse de la importación ilegal de archivos.

Además, me gustaría implementar negación plausible . Se verá así: hay dos unidades de almacenamiento, una de ellas está encriptada con una contraseña vacía y está bien exponer su contenido a cualquier persona. Se utiliza para ocultar el hecho de que hay algo oculto. Solo un escudo adicional.

La clave en la que se basa la seguridad de todo el sistema es que la contraseña del usuario se almacena solo en su cabeza, i. mi. programable (a menos que haya keylogger, software telepático o satélite con cámara de alta resolución que lo pueda ver escribiendo).

Implementación

Por ahora he terminado con el siguiente esquema.

  1. La contraseña del usuario es una clave para cifrar / descifrar la (s) contraseña (s) de nivel 2 generadas aleatoriamente. Se utiliza código simétrico (por ejemplo, AES que se considera seguro por el momento).

  2. La criptografía de nivel 2 es asimétrica. La clave de cifrado (pública) se utiliza al importar archivos no cifrados de fuentes externas. La clave Decription (privada) se utiliza para leer archivos. Como los algoritmos asimétricos son lentos, estas claves se utilizan realmente para proteger la clave de sesión (única para cada archivo). La clave privada está disponible en la memoria como texto simple solo cuando se encripta la clave de sesión.

  3. El nivel 3 usa criptografía simétrica, AES nuevamente o algún cifrado de flujo seguro (solo en el caso de un rendimiento mucho mejor porque se prefiere la seguridad). Se utiliza para cifrar / descifrar realmente el contenido del archivo.

Finalmente lo has leído hasta el final :) Aquí están las preguntas:

  1. ¿Cómo simplificar este esquema sin dañar la seguridad?

    En resumen: eliminar el nivel medio. Sin embargo, todavía tengo que usar dos niveles, para evitar la fatiga por cipher / enthropy agotador y para satisfacer mi paranoia :)

  2. ¿Cómo mejorar su seguridad? Sé que hay errores aquí, crypto es una cosa difícil.

    Muchas gracias a @DeerHunter por señalar posibles fallas.

  3. ¿Qué buscar en google y leer sobre esto? No hay cosas fundamentales como Shneier, por favor :)

    Bueno, tengo suficientes términos y conceptos para sumergirme. Por ahora, al menos.

  4. Todavía no estoy seguro de si debo usar claves asimétricas (en el nivel uno). Pensé que ayudaría a dividir los riesgos: la clave de descifrado (privada) se genera como texto sin formato solo por un momento, mientras que la clave de encriptación (pública) puede ser expuesta a todos. Pero en comparación con los syphers simétricos, todavía tengo una clave para asegurar en la RAM, y hay una clave (pública) adicional de la que preocuparse.

EDIT1 . No no quiero diseñar mi propio estándar, está más allá de mi conocimiento. Voy a usar cosas que se demuestren seguras cuando sea posible. P.ej. Lo que haré solo es combinar varias clases de Crypto ++ para trabajar en conjunto. Solo necesito el diseño adecuado para hacerlo. Por ahora no creo que el cifrado de disco completo sea adecuado en mi caso. He pensado en TrueCrypt, etc., pero no permite ocultar la presencia de los datos cifrados. Preferiría una solución (protocolo criptográfico o protocolo) para el cifrado por archivo.

EDIT2 . Se reorganizó el texto para dividir los requisitos y la implementación, se agregaron requisitos de plausibilidad denegable.

EDIT3 Queda una pregunta más sobre la criptografía asimétrica.

    
pregunta Kirill Gamazkov 10.07.2013 - 15:33
fuente

3 respuestas

3

Ni siquiera terminé de leer tu OP para determinar si el esquema es demasiado complejo.

Introduzca la contraseña del usuario en una función de derivación de clave; PBKDF2, dado el número apropiado de rondas de hashing, está bien. El valor producido es ahora la clave de encriptación simétrica para todos los datos, utilizando AES o cualquier algoritmo de encriptación que usted elija. Una vez cifrado, no importa dónde se coloca cada archivo; nadie puede leer el contenido del texto sin formato sin saber la contraseña del usuario (que es un verdadero secreto) y la configuración específica para la función PBKDF2 (que no lo es) y el modo de cifrado (ídem).

Si desea que el usuario pueda cambiar su contraseña sin tener que descifrar y volver a cifrar todo el almacén de datos, necesita un intermediario. Genera una clave aleatoria y IV para cada archivo que se está asegurando. Almacene el nombre de archivo, la clave y la IV como una fila de un archivo de claves maestro, cuyos contenidos se cifran con la contraseña del usuario y una IV constante. Cuando el usuario cambie su contraseña, descifre el archivo de claves utilizando la clave anterior basada en la contraseña del usuario y el IV actual, luego derive la nueva clave de la nueva contraseña, genere un nuevo IV aleatorio y vuelva a cifrar el archivo de claves.

Si desea que el usuario pueda recuperar sus datos si olvida su contraseña, debe suceder una de dos cosas; una copia del archivo de claves maestras debe cifrarse utilizando una clave conocida por el sistema host, o bien la contraseña del usuario o la clave derivada deben cifrarse de manera similar. Esto se puede lograr con claves públicas que permiten que el software cliente del usuario maneje este paso adicional de forma segura. En el caso de que se necesite una recuperación, la clave privada se puede aplicar para descifrar el archivo de claves maestro (directa o indirectamente, según el método exacto), que luego se puede volver a cifrar con una contraseña de reemplazo suministrada por el usuario.

Algunas cosas adicionales a considerar:

  • En ningún momento debe persistir en el disco duro la contraseña de texto sin formato del usuario, o las versiones sin cifrar de cualquier archivo, especialmente el archivo de claves maestro. Si alguna vez se escribe en el disco, un atacante puede volcar el disco, examinar su contenido y descubrir los secretos del usuario.
    • Esto requiere que tenga suficiente control sobre el sistema operativo para asegurarse de que ninguno de estos datos se intercambie de la RAM al archivo de páginas de la memoria virtual (o que se elimine rápidamente cuando ya no sea necesario).
    • Esto también generalmente requiere que tales secretos nunca estén en la RAM por más de un período de tiempo transitorio mientras se deriva activamente la clave de la contraseña o el cifrado / descifrado de los archivos protegidos. Una vez que ya no necesite el texto simple, destrúyalo.
  • Su programa estará encriptando y desencriptando una gran cantidad de datos. Esto podría, con el tiempo, hacer que el esquema sea vulnerable a la fatiga del cifrado, donde después de que se haya cifrado una gran cantidad de datos, la entropía inherente en los secretos del cifrado se agotará y el estado del cifrado será repetible.
    • Por lo general, esto no es una preocupación para ningún archivo, o incluso para un gran almacén de datos, pero podría ser problemático si usa una tecla para todo , para siempre .
    • Entonces, no lo hagas. Cada vez que su usuario actualiza un archivo cifrado, genere una nueva clave e IV para ese archivo, y actualice el archivo de claves maestras con la nueva información. Debido a que eso requiere descifrar y volver a cifrar el archivo de claves maestro, tampoco es una mala idea generar un nuevo IV aleatorio para el paso de cifrado (por supuesto, la clave es relativamente estática, pero estas operaciones también son buenas oportunidades para aumentar la fuerza del KDF mediante aumentando el número de rondas de hash).
respondido por el KeithS 10.07.2013 - 23:39
fuente
6

La primera y, probablemente, la única forma de hacer que esas cosas estén seguras es no hacerlo usted mismo . Implementar adecuadamente un protocolo criptográfico sin perder información en todas partes es difícil; diseñar un protocolo criptográfico es más difícil.

Dado que el usuario importa los archivos por sí mismo y los lee, no es necesario invocar la criptografía asimétrica. La criptografía asimétrica es para cuando hay (al menos) dos jugadores con derechos distintos (por ejemplo, un firmante y un verificador; o un remitente y un destinatario); Aquí está el usuario y él mismo: el mismo tipo, por lo tanto no hay necesidad de asimetría. Otra forma de ver eso es que la criptografía asimétrica fue diseñada para resolver el problema de compartir información secreta entre varias personas. Un usuario no tiene problemas para compartir información secreta consigo mismo.

Por lo tanto, la estructura básica es cifrar archivos con una clave derivada de un secreto que encaja en el cerebro del usuario (la contraseña). Esto apunta a las herramientas para el cifrado completo del disco, que existen para muchos sistemas operativos. Algunas versiones recientes de Windows vienen con BitLocker . Las buenas distribuciones de Linux tienen su propio sistema. Un producto de terceros muy recomendado para el cifrado completo del disco es TrueCrypt . Usa uno de estos y vivirás más y más feliz.

    
respondido por el Thomas Pornin 10.07.2013 - 16:01
fuente
1

Creo que estás hablando de algunas medidas de seguridad que se confundieron.

1) Privilegios: no debe tener acceso seguro a la carpeta donde esté el archivo (ya sea que esté oculto o no). Use el sistema de privilegios incorporado de Windows / Linux y asigne derechos de lectura / escritura / ejecución basados en los usuarios. Si alguien te colocó un virus o hackeó tu PC y obtuvo los derechos de usuario de root / Sys ... entonces estás en problemas.

2) Contraseña / Contraseña Protección de clave: AES 128 bit es un algoritmo fuerte que debe usarse para cifrar el contenido de un archivo. Pero recuerde que la clave del cifrado se encuentra dentro del sistema ... si la clave es secuestrada, el archivo se puede descifrar ... ¡las claves se utilizan para cifrar y descifrar datos en cifrado simétrico, recuerde! Así que tu trabajo es proteger la clave.

3) Fuerza de encriptación: la fuerza de encriptación tiene algunos factores, debe usar una encriptación que no sea predecible, y usar buenos elementos de difusión, confusión, efecto de avalancha, vectores de inicialización (IV) y un potente generador de Keystream para crear una buena secuencia de teclas fuerte.

4) Administración de contraseñas de usuarios: la contraseña de los usuarios debe ser segura, compuesta de caracteres alfanuméricos y no alfanuméricos. Además, el panel de la entrada de la contraseña no debería ser fácil de usar fuerza bruta, usar captcha o ralentizar el tiempo cada vez que se realizó un intento incorrecto, lo que evitaría la fuerza bruta.

    
respondido por el BlackFire27 10.07.2013 - 21:32
fuente

Lea otras preguntas en las etiquetas