Almacenar de forma segura la clave AES con criptografía de clave pública

1

novato de seguridad aquí

Tengo un script bash que enumera recursivamente todos los archivos y directorios de una ruta determinada (por ejemplo, /home/user ) y encripta archivos individuales y los almacena en otro directorio (por ejemplo, /media/backup ) manteniendo la estructura del directorio. Estoy utilizando el cifrado de clave simétrica de GPG (AES 128) para este propósito.

Ahora el problema es que GPG me pide que ingrese una contraseña para cada archivo que se va a cifrar. Ya que hay varios archivos, esto no es factible. Así que las soluciones que podría pensar son -

  1. Indica al usuario que ingrese la clave, la almacene en una variable y use esa variable en el script para la contraseña (con la opción echo $password | gpg ... --passphrase-fd 0 --batch ). El usuario debe memorizar la contraseña.
  2. Crea una nueva identidad de clave pública / privada con GPG. Cree un nuevo archivo de texto que contenga la contraseña y cifrelo con la clave pública de esta nueva identidad y guárdelo localmente. Ahora en el script, descifre este archivo de contraseña y use la contraseña así descifrada. Nuevamente, en este caso, el usuario ingresa la contraseña de la clave privada (memorizada) una vez.

Para mí, ambas soluciones parecen similares (el usuario tiene la pieza final requerida para descifrar los archivos). Me gustaría saber si una solución es mejor que la otra, o incluso si ambas son inseguras; Y en ese caso cuál debería ser la solución ideal.

El modelo de amenaza aquí es, si mis archivos cifrados & Mi sistema está comprometido y un adversario obtiene acceso de usuario / root a mi sistema, no deberían poder descifrar los archivos sin la contraseña memorizada.

Editar : la persona que publica esta pregunta ( enlace ) afirma que el cifrado simétrico de archivos y luego el cifrado asimétrico de la clave es la forma correcta de hacerlo. ¿Implica eso que # 2 es la forma preferida?

    
pregunta Abhishek Nagekar 02.09.2017 - 15:57
fuente

1 respuesta

1

En general, la mejor solución de las dos es la # 2, pero no solo por sus propiedades de seguridad. Más aún debido a la conveniencia del usuario. Repasemos por qué.

Opción # 1: la contraseña del usuario (potencialmente débil) se almacena en una variable y se usa n veces, donde n es la cantidad de archivos con los que está tratando. Guardarlo en la memoria durante tanto tiempo podría aumentar el riesgo de que se filtre o se vea comprometido.

Opción # 2: Suponiendo que utilice un algoritmo de cifrado asimétrico (ECC) relativamente rápido, realmente no debería haber una penalización de tiempo por el uso de esta opción. Para el cifrado, la entrada del usuario no es necesaria ya que se utiliza la clave pública. La clave privada se almacena encriptada, por lo que, para el descifrado, el usuario ingresa una clave una vez para desbloquearla. Por supuesto, en este caso, la clave privada tiene el potencial de ser comprometida desde la memoria, pero el riesgo solo existe al descifrar.

La pregunta principal es esta. ¿Quieres que tu usuario esté ingresando su clave más o menos? La respuesta obvia es, por supuesto, menos, por lo que el esquema # 2 es la mejor opción.

( También, considere ejecutar la contraseña del usuario a través de una función de derivación de clave (por ejemplo, scrypt o argon2) antes de usarla como clave de cifrado. )

EDITAR:

Aparentemente, había leído mal tu segunda opción y asumí que estabas usando un cifrado asimétrico para cifrar los archivos. En ese caso, recomendaría usar lo que supuse que habías querido decir.

  1. Genere un par de claves público-privadas de curva elíptica.
  2. Cifre la clave privada (simétricamente) con una contraseña definida por el usuario que se ha ejecutado a través de una función de derivación de clave.
  3. En el cifrado, use la clave pública para cifrar automáticamente los archivos del usuario sin necesidad de que el usuario los ingrese.
  4. En el descifrado, se necesita la contraseña de usuario para derivar la clave para descifrar la clave privada que posteriormente se usaría para descifrar los datos.

Para garantizar la correcta confidencialidad, autenticidad e integridad, usaría algo como crypto_box de NaCl para implementar mi cifrado.

    
respondido por el Awn 02.09.2017 - 16:15
fuente

Lea otras preguntas en las etiquetas