sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Método seguro para almacenar/recuperar una clave privada y una frase de contraseña de PGP?

(Nota:no soy un experto en seguridad. Tengo interés en el área, pero eso es todo. Téngalo en cuenta).

Si es posible, no almacene contraseñas

Depende mucho de cuáles sean tus necesidades. La mejor opción de todas es no utilizar en absoluto el cifrado bidireccional; si puede almacenar solo salado y one-way-hashed resúmenes de contraseña que es ideal. Todavía puede probarlos para ver si coinciden con una contraseña proporcionada por el usuario, pero nunca la almacena.

Mejor aún, si sus clientes usan algún protocolo sensato (es decir, no HTTP como se implementa comúnmente), puede usar un mecanismo de autenticación de desafío-respuesta eso significa que su aplicación nunca nunca necesita ver la contraseña del usuario, ni siquiera al autenticarlo. Lamentablemente, esto rara vez es posible en la web pública, que tiene una seguridad que avergonzaría a los programadores de los 80.

Si debe almacenar la contraseña, aísle las claves de la aplicación

Si debe poder descifrar las contraseñas, idealmente no debería tener todos los detalles para hacerlo en un solo lugar, y ciertamente no en un lugar copiable y de fácil acceso.

Por esa razón, personalmente preferiría no usar PgCrypto (como lo está haciendo) para este propósito porque lo obliga a revelar la clave privada y (si tiene una) la frase de contraseña al servidor, donde podría estar expuesta en PostgreSQL. archivos de registro o de otro modo potencialmente olfateados. Me gustaría hacer mi cripto del lado del cliente, donde podría usar PKCS#11, un agente clave u otras herramientas que me permitan descifrar los datos sin que mi código pueda acceder a la clave.

El problema del almacenamiento seguro de claves es parte de lo que PKCS#11 fue inventado para. Proporciona una interfaz genérica para que las aplicaciones y los proveedores de cifrado se comuniquen con cualquier cosa que pueda proporcionar ciertos servicios de firma y descifrado sin revelar su clave. . El uso habitual, pero no el único, es con criptografía basada en hardware, como tarjetas inteligentes y módulos criptográficos de hardware. A estos dispositivos se les puede indicar que firmen o descifren los datos que se les pasan, y pueden hacerlo sin revelar la clave. Si es posible, considere usar una tarjeta inteligente o HSM. Por lo que sé, PgCrypto no puede usar PKCS#11 u otros HSM/tarjetas inteligentes.

Si no puede hacer eso, probablemente aún pueda usar un agente de administración de claves, donde carga su clave en un programa de administración de claves manualmente cuando se inicia el servidor, y el programa de administración de claves proporciona una interfaz PKCS # 11 (o alguna otra) para firmar y descifrar a través de un socket. De esa manera, su aplicación web nunca necesitará saber la clave. gpg-agent puede calificar para este propósito. Nuevamente, hasta donde yo sé, PgCrypto no puede usar un agente de administración de claves, aunque sería una gran característica para agregar.

Incluso una pequeña mejora puede ayudar. Es mejor si la frase de contraseña de su clave no está almacenada en el disco, por lo que es posible que deba ingresarla cuando se inicia la aplicación para que la clave se pueda descifrar. Todavía está almacenando la clave descifrada en la memoria, pero todos los detalles para descifrarla ya no están en el disco y son fáciles de obtener. Es mucho más difícil para un atacante robar la clave descifrada de la memoria que obtener un "contraseña.txt" del disco.

Lo que elija hacer depende mucho de los detalles de sus necesidades de seguridad y de los datos con los que está trabajando. En su posición, simplemente no almacenaría las contraseñas si fuera posible, y si tuviera que hacerlo, usaría un dispositivo de hardware compatible con PKCS#11.