Cifrado de datos del núcleo
Tengo una pregunta sobre el cifrado de datos básicos. Estoy almacenando algunos datos confidenciales del usuario en una base de datos Core Data SQLite. Los valores críticos son todos transformables y estoy usando AES256 para cifrarlos y descifrarlos "sobre la marcha", incluido un IV individual para cada valor. La clave de cifrado es el hash SHA512 de la contraseña que el usuario ha elegido. Esto funciona muy bien hasta ahora.
Ahora sobre la contraseña de usuario. Cuando el usuario inicia la aplicación, se le pide su contraseña. La contraseña se está procesando con SHA512 y se almacena en el llavero de iOS. Por cada operación de escritura o lectura, el NSValueTransformer obtendrá la contraseña del llavero. Si la aplicación se está cerrando, elimino el hash de contraseña del llavero.
En mi base de datos Core Data, tengo una entidad especial que tiene un número aleatorio! = 0, ya que solo tiene valor. Para comprobar si el usuario ha ingresado la contraseña correcta, busco esta entidad y leo el número. Si es =! 0, sé que la contraseña era correcta porque cuando el descifrado falla, el NSValueTransformer siempre devuelve 0.
Ahora mis preguntas reales: ¿Consideraría esto un buen enfoque para el cifrado? ¿De qué otra manera probarías si la contraseña ingresada es correcta?
Estoy un poco preocupado de que almacenar el hash de la contraseña en el llavero mientras se ejecuta la aplicación hace que todo sea más lento, ya que el NSValueTransformer tiene que acceder al llavero todo el tiempo. ¿Sería lo suficientemente seguro simplemente para mantener el hash de la contraseña en la memoria, de modo que se eliminará cuando se cierre la aplicación?