Estoy buscando una forma eficiente de cifrar múltiples campos en una base de datos con AES usando una sola clave global, utilizada en una gran aplicación web.
Obviamente, para reutilizar esta clave, se requiere un IV aleatorio único para cada campo que se va a cifrar.
Prefiero no introducir más campos en la base de datos para almacenar cada una de estas IV, por lo que el enfoque programático parece ser derivar estas IV de alguna manera.
Estoy jugando con el uso de cualquiera:
key = sha256(global_key + table_name)
iv = sha256(column_name + primary_key)
O incluso simplemente:
key = global_key
iv = sha256(table_name + column_name + primary_key)
Me inclino hacia el primero para generar claves por tabla.
Ya he ya leí que las IV no deben mantenerse en secreto. Así que estoy trabajando en la suposición de que una clave derivada o IV (incluso si el algoritmo se conoce), no es más insegura que cualquier otra IV no secreta, siempre que el original la clave permanece secreta .
La pregunta es:
¿Hay un error fatal en mi enfoque? ¿Estoy presentando alguna deficiencia grave que, en caso de que un adversario obtenga una copia de la base de datos, le facilitaría la recuperación de los datos en texto sin formato?
Me doy cuenta de que es potencialmente solicitar respuestas de una palabra.
Las sugerencias para esquemas alternativos / mejores son muy bienvenidas, así como las referencias a trabajos existentes y cómo implementan escenarios similares.