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. .