Digamos que en una aplicación de Android, el usuario debe ingresar un PIN de 6 dígitos al inicio. Digamos también que tenemos algunos datos confidenciales en esta aplicación que nos gustaría cifrar.
La forma en que lo haría es:
- Usando una función de derivación de clave (por ejemplo, PBKDF2) generamos una clave desde el PIN.
- Cifre los datos confidenciales con AES usando la clave (y una configuración decente como el relleno CBC +).
- Almacena datos encriptados donde sea, por ejemplo, en preferencias compartidas.
El problema principal que veo aquí: el espacio del PIN original para un PIN de 6 dígitos es 10 ^ 6, que es ridículamente pequeño para usar como base de su cifrado ...
¿Podemos realmente ajustar esto para que los datos almacenados sean razonablemente seguros por un tiempo?
Incluso si ajustamos nuestro KDF de modo que una derivación simple demore 1 segundo (no creo que podamos esperar que nuestros usuarios esperen mucho más durante el inicio de la aplicación), luego pasar por 1'000'000 de ellos tomará solo 11.5 días (asumiendo la misma potencia de procesamiento que el teléfono, lo cual no es probable ...).
Restricciones:
Obviamente, el uso de un PIN más largo / fuerte ayudaría, pero lamentablemente incluso un PIN de 6 dígitos es visto como un obstáculo para los usuarios, por lo que esta no es una opción. Además, la fuerza KDF está limitada por la cantidad de tiempo que podemos esperar que esperen los usuarios durante el inicio de la aplicación, lo que yo diría que es del orden de 1 segundo.