Diga que quiero crear un almacenamiento de clave privada basado en la nube para los usuarios, que pueden usar para firmar documentos .
En el lado del servidor, usaría un HSM para hacer que el almacenamiento de claves sea más seguro.
Una opción es que la firma ocurra en el lado del servidor. Pero, de esta manera, el servidor conoce la clave privada del usuario, que no es lo que yo quisiera.
Otra opción es hacer que la clave privada del usuario se incluya en una clave simétrica (por ejemplo, AES ) solo conocida por el usuario, y almacenarla en el HSM .
Esta clave AES se derivaría de la contraseña del usuario. Existen mecanismos como PBKDF2 para crear una clave a partir de una contraseña.
Luego, cuando el usuario solicita firmar un documento, el servidor enviará la clave privada de ese usuario cifrada mediante la clave AES que solo conoce ese usuario.
El lado del cliente (que podría ser una aplicación de Android o una aplicación web basada en javascript ) se utiliza para hacer una firma.
Además, tendría que haber un mecanismo de cambio de contraseña que funcionaría de la siguiente manera:
- el cliente solicita su clave privada del servidor (cifrada por su AES) clave)
- el cliente descifra la clave privada usando la clave AES derivada de su contraseña
- el cliente genera una nueva clave con su nueva contraseña
- el cliente cifra su clave privada con su clave AES y la envía al servidor
- el servidor actualiza la clave privada del usuario envuelto con la nueva
No sé mucho acerca de los módulos HSM , pero según tengo entendido, tienen una funcionalidad similar a la de una tarjeta inteligente (la clave nunca debería dejar el HSM y todo el cifrado debería ocurrir en él).
Leí en algún lugar que algunos HSM permiten la extracción de claves cuando PKCS # 11 "CKA_EXTRACTABLE" se establece al momento de la generación de una clave. Pero, ¿no sería eso, en su mayor parte, derrotar al único propósito del HSM ?
Además, ¿podría implementar el mecanismo para cambiar la contraseña que describí al usar un HSM ?
Otra opción sería que la firma se realice en el HSM y que las claves privadas estén envueltas por la clave AES , generada a partir de la contraseña del usuario. HSM luego desenvuelve la clave privada y firma el archivo, pero el proveedor de la nube no puede acceder a la clave privada.
¿Sería posible, en este caso, implementar el mecanismo de cambio de contraseña que describí?
Además, los mecanismos de derivación de clave basados en contraseña utilizan salt para hacer los ataques de tabla arco iris más difíciles.
¿Cómo se usaría la sal en este caso? ¿Se almacenará en el servidor y luego se transferirá al cliente cuando use el servicio?
El requisito es que el usuario pueda usar el servicio en cualquier dispositivo (móvil, de escritorio) solo con saber su nombre de usuario / contraseña.
Probablemente incluiría 2FA al agregar la verificación de SMS cuando se autentique en el servidor.