¿Cómo almacenar de forma segura la contraseña de cifrado utilizada más recientemente para su posterior reutilización en una aplicación?

4

Digamos que tengo una aplicación móvil que puede guardar fotos dentro de archivos PDF encriptados AES-128 protegidos con contraseña. Para mayor comodidad, quiero que el usuario pueda cifrar un archivo con la contraseña utilizada anteriormente sin tener que ingresarlo nuevamente, pero también quiero que sus datos estén seguros si pierden su teléfono o lo roban. Obviamente, solo guardar la contraseña en texto sin formato en el archivo de preferencias no es una opción.

En un PDF, la clave de cifrado AES se genera así:

key = hash(password + file_id + permission_flags)

Donde el hash es una combinación de RC4 y MD5, y file_id es un número aleatorio de 128 bits almacenado en texto plano en el archivo. Hay algunas advertencias adicionales: cada objeto en el archivo está encriptado con una clave diferente derivada de la principal, y también hay contraseñas de "usuario" y "propietario" separadas, pero ignoremos todo eso por el simple hecho de serlo, y asumamos que los permission_flags no cambian de un archivo a otro.

El cifrado de la contraseña para su reutilización posterior no es seguro porque cualquier método que permita que la aplicación descifre la contraseña y la use para generar la clave de cifrado dado que se podría usar un file_id, se genera para descifrarla.

Idea: como los file_ids son solo números aleatorios, no tenemos que esperar a que se creen los archivos antes de generarlos, podemos generar un lote de varios miles de file_ids y generar las claves asociadas con la contraseña y el almacén. como tuplas en un archivo. Luego, cuando el usuario guarda un archivo, podemos leer una clave y un file_id, cifrar el archivo con la clave, escribir el file_id en el archivo y luego eliminar la tupla. Entonces, si un atacante se apodera del dispositivo, solo tendrán las claves para los archivos que aún no se han guardado, y no habrá forma de generar las claves para los archivos que tienen. Una vez que el alijo se agota, el usuario simplemente tiene que volver a ingresar la contraseña. Si el usuario cambia la contraseña, el archivo se elimina y se genera uno nuevo con la nueva contraseña.

Parece que podría funcionar, pero nunca antes había oído hablar de esta técnica, así que me resisto a usarla como "enrollar tu propia criptografía". También parece que podría ser un problema si el usuario realiza una copia de seguridad de su dispositivo, porque entonces habrá copias adicionales flotando alrededor de todas las claves.

¿Cuál es la mejor solución para este problema de reutilización de claves, suponiendo que no haya cifrado en todo el sistema a nivel de sistema operativo?

    
pregunta samgak 14.03.2016 - 05:45
fuente

0 respuestas

Lea otras preguntas en las etiquetas