¿Dónde almacenar las claves AES al cifrar archivos en reposo?

1

He pasado por la siguiente pregunta:

Y lea los artículos a continuación sobre cómo cifrar archivos usando AES en modo CBC :

Pero no obtuve mi respuesta. En lugar del archivo, supongamos que tengo texto para cifrar, así que hago lo siguiente:

from Crypto.Cipher import AES
import hashlib

password = 'A_VERY_STRONG_RANDOM_PASSWORD'
key = hashlib.sha256(password).digest()

IV = ''.join(chr(random.randint(0, 0xFF)) for i in range(16))

mode = AES.MODE_CBC
encryptor = AES.new(key, mode, IV=IV)

text = 'j' * 64 + 'i' * 128
ciphertext = encryptor.encrypt(text)

Los usuarios del sistema tienen cientos de archivos y todos deben estar cifrados en reposo, por lo que quiero usar AES, ya que su cifrado es rápido y seguro.

La primera pregunta es que ¿necesito generar una nueva contraseña cada vez que quiero cifrar un archivo? ¿O debería ser por usuario? o todo el sistema? ¿Cuál es la mejor práctica y la más segura?

La segunda pregunta es que ¿dónde debo almacenar estas / estas contraseñas?

NOTA: no quiero usar HSM ni ningún hardware externo para esto.

    
pregunta ALH 06.08.2018 - 09:23
fuente

1 respuesta

0

Llamemos al sistema que realiza el cifrado E y a cualquier sistema que almacene los archivos cifrados S (para almacenamiento).

Los archivos almacenados en S son seguros siempre que el atacante no tenga la clave correspondiente.

Ya que no desea utilizar un HSM, podemos asumir que cualquier clave almacenada en E se verá comprometida si E está comprometida. Ahora tienes básicamente dos opciones de almacenamiento: disco o memoria. En el disco es bastante trivial: utiliza las ACL del SO para restringir el acceso a la clave de cifrado y espera que esté bien. En memoria, puede construir un sistema que requiera que suministre manualmente un secreto maestro (escribir, leer un código QR a través de una cámara web, etc.) cuando se inicie el servicio de cifrado (o en la rotación de claves, consulte más abajo). De esta manera, no se puede acceder a la clave a través de las vulnerabilidades que proporcionan solo acceso al servicio fijo (por ejemplo, recorrido de ruta). Tenga en cuenta que en Python tendrá un tiempo difícil para borrar los secretos de la memoria, pero puede usar hacks sucios como this .

(tenga en cuenta que Seguridad basada en virtualización puede "emular" "HW adicional que tendría beneficios notables, pero no creo que coincida con su caso de uso)

Esperando el compromiso de E, sería una buena idea rotar las claves periódicamente (y mover las claves antiguas de E a un almacenamiento seguro fuera de línea) para que cualquier incidente no afecte a los archivos cifrados con claves anteriores. El período de rotación clave debe depender de sus necesidades.

Editar: en el caso de un cifrado decente como el cifrado AES, un gran número de archivos con la misma clave no es un problema, por lo que el uso de una sola clave no produce un cifrado más débil que el uso de varias claves. Al final del día se trata de la gestión de claves.

El uso de cifrado por archivo o por usuario también depende de los requisitos de administración de claves. Las claves por usuario pueden tener sentido si necesita descifrar archivos por usuario. Las contraseñas por archivo pueden limitar el impacto de un compromiso, pero archivar claves antiguas puede ser problemático y debe tener en cuenta que los sistemas generalmente permanecen en un estado comprometido durante largos períodos de tiempo, por lo que esto no es de gran ayuda que un proceso de cambio de clave periódico. .

    
respondido por el buherator 06.08.2018 - 14:10
fuente

Lea otras preguntas en las etiquetas