En el lado del cliente, podría utilizar PBKDF2 o una derivación de clave similar
función para generar una clave que luego usar para cifrar / descifrar la
Clave simétrica antes de utilizarlo. ¿Sería esto considerado (aceptablemente)?
seguro?
Esto realmente depende de algunas cosas:
1. ¿Cuál es el modelo de amenaza?
¿A quién intentas impedir que te ataque? ¿Un estado nación? Un otro celoso significativo? ¿Un script para niños? ¿Tendrá esta persona acceso físico al dispositivo del cliente? Etc.
2. ¿Qué estás usando como entradas para tu KDF (PBKDF2 en tu ejemplo)?
Con suerte, la entrada al KDF es algo que no se conserva en el dispositivo (a excepción de la sal y las rondas, puede dejar las que cuelgan alrededor), sino algo de suficiente entropía que el usuario está obligado a ingresar una vez (por ejemplo, una frase de contraseña) y luego se borra de la memoria una vez que ya no se necesita más.
3. ¿Cómo está cifrando y almacenando las claves?
Si hay disponible hardware dedicado de confianza (por ejemplo, TPM o HSM [suponiendo que confía en ellos]), entonces le proporcionarán una forma de almacenar sus claves simétricas (algunas las almacenan en el hardware dedicado y otras las cifran con una clave) que se almacena en el hardware pero almacena el texto cifrado resultante en su dispositivo de almacenamiento). Si no se dispone de dicho hardware, normalmente almacenará las claves en un almacén de claves que es básicamente un archivo (o conjunto de archivos) que almacena las claves de manera cifrada. Ya hay varias implementaciones disponibles, pero si va a rodar las suyas (que NO recomiendo), entonces debe considerar cómo protegerá la confidencialidad y la integridad de sus claves cifradas. Algunas cosas a considerar son:
- ¿Se empaquetará cada clave que se va a cifrar con un KEK diferente?
- ¿Cómo derivarás cada KEK?
- ¿Qué algoritmos / modos usarás?
- ¿Qué tipo de rendimiento necesitas?
4. ¿Qué hace con las claves en la memoria cuando ya no las necesita?
Cada copia de cada clave debe borrarse de la memoria una vez que ya no sean necesarias. Hay debates sobre cómo hacer esto que van desde solo escribir un montón de ceros sobre los bytes en la memoria hasta hacer cosas más sofisticadas que involucran múltiples pases y cada uno escribe diferentes bytes en el área de la clave en la memoria. Lo que hagas debe depender de tu modelo de amenaza.
¿Qué posibilidades hay en el lado del servidor? Qué procedimiento haría
¿Se considera seguro almacenar esa clave en una base de datos?
El lado del servidor tiene opciones muy similares. Lo ideal sería que el servidor usara un HSM y almacenara las claves allí (vea # 3 más arriba para más detalles) y su aplicación del lado del servidor nunca tendría acceso a los bytes de claves sin procesar (solo lo haría el HSM). En la base de datos simplemente almacenaría el alias de la clave (podría usar el HSM para proporcionar integridad en el enlace entre el registro de la base de datos y el alias).
¿Cómo, por ejemplo, Amazon almacena sus claves simétricas utilizadas para su
autenticación de cadena de consulta para S3?
No estoy seguro de lo que Amazon hace específicamente para la autenticación de cadenas de consulta para S3, pero sí sé que proporcionan un Servicio Cloud HSM .