Tengo una aplicación de Android que se basa internamente en una base de datos SQLite que almacena datos de usuarios cifrados. Los datos se cifran utilizando AES-256, con una clave generada por el algoritmo PBKDF2-HMACSHA256. La aplicación tiene la necesidad de detectar la manipulación de los datos mediante métodos malintencionados o no malintencionados (es decir, corrupción de datos o alguien intencionalmente manipulando la base de datos).
Por lo que puedo decir, tengo dos opciones sólidas sobre cómo generar de forma segura un hash para representar estos datos. O bien, puedo confiar en un algoritmo HMAC-SHA256 con la misma contraseña utilizada para generar la clave AES-256 para generar firmas de los datos en cada fila de la base de datos. Alternativamente, podría generar un hash SHA-256 ordinario de los datos desencriptados almacenados en la memoria antes de volver a cifrarlos para actualizar la fila de la base de datos. Entonces, en teoría, solo el usuario autenticado con la clave correcta puede descifrar los datos y, por lo tanto, solo ese usuario puede generar esta "firma".
Aquí está mi pregunta: usar HMAC-SHA256 causará complicaciones con la forma exacta de conservar la contraseña como la clave o de alguna manera para aprovechar la clave SHA-256 como la clave HMAC. De cualquier manera, parece no necesariamente doloroso y la complejidad es, en general, algo nuevo para los sistemas seguros. ¿Sería igualmente seguro confiar en un hash SHA-256 ordinario de datos descifrados, como utilizar un algoritmo de hash de estilo HMAC? Al igual que en, ¿son igualmente difíciles / imposibles de forjar una firma?