OpenPGP
La forma estándar de manejar esto es almacenar los mensajes cifrados en formato estándar OpenPGP .
¿Hay alguna razón para no usar alguna biblioteca comercial que implemente RFC 4880 y RFC 3156 ?
(Hay mucha discusión práctica sobre OpenPGP en este sitio de Seguridad de TI y una discusión más teórica de OpenPGP en el sitio Cryptography StackExchange ).
El mensaje cifrado en formato OpenPGP se puede almacenar como un archivo, un BLOB de SQL, etc.
details
OpenPGP funciona exactamente como se explica fin1te
(por lo que puedo decir, openssl_seal () también funciona exactamente de la misma manera):
- Para cada mensaje, el sistema genera una clave de sesión nueva, nueva y aleatoria que nadie más podría adivinar. Después de almacenar el mensaje cifrado completo BLOB, el sistema olvida esa clave inmediatamente.
- El texto sin formato del mensaje se cifra con esa clave de sesión y se almacena en el paquete de datos cifrados simétricamente dentro del BLOB.
- Varios paquetes de claves de sesión encriptadas se almacenan dentro del BLOB; cada una contiene otra copia idéntica de la clave de sesión para este mensaje, cada una encriptada con una clave pública diferente. En este caso, una copia se cifra con la clave pública del remitente, y otra copia se cifra con la clave pública del administrador.
Cuando alguien (el usuario o el administrador del sistema) desea leer un mensaje cifrado,
esa persona entrega el mensaje cifrado y su frase de contraseña a una pieza de software que lo descifra y le muestra el texto en claro.
Ese software normalmente:
- alimenta la frase de contraseña en una función de derivación de clave. El software utiliza la clave resultante para descifrar un archivo de conjunto de claves para obtener la clave privada de ese usuario y su correspondiente clave pública. (Alternativamente, supongo que uno podría usar una función de derivación de clave para generar una clave privada a partir de una frase de contraseña , luego generar la clave pública a partir de esa clave privada).
- busca todos los paquetes de clave de sesión encriptados dentro del BLOB hasta que encuentre uno con una clave pública que coincida.
- Utiliza la clave privada para descifrar la clave de sesión. Luego usa la clave de sesión para descifrar el mensaje de texto simple.
Mientras evite enviar la contraseña a través de HTTP u otros protocolos de texto simple,
Esto parece seguro contra ataques pasivos (ver lo que pasa por el cable; leer las cintas de respaldo del servidor, incluidas todas las claves públicas y el anillo de claves cifrado del administrador).
EDITAR:
¿Dónde debo guardar el par de llaves cifradas?
Esa es una excelente pregunta, digna de una página de preguntas / respuestas completamente nueva.
En un mundo ideal, le darías a cada usuario un token de seguridad que, cuando se activó por primera vez, generó un nuevo par de llaves y te dio la clave pública, pero la clave privada nunca dejaría el token.
En nuestro mundo menos que ideal, muchas personas usan Gnome Keyring o algún software similar para almacenar el par de llaves cifradas en su computadora portátil o teléfono inteligente personal, como se explica en
"formatos estándar de almacenamiento de claves privadas?" .
Sospecho que preferiría un sistema donde no tenga que comprar un montón de tokens de seguridad, y donde sus usuarios aún puedan acceder a sus propios archivos en su servidor, incluso si su teléfono inteligente se perdió accidentalmente o fue bloqueado o destruido de alguna manera. Otra manera.
Eso te obliga a almacenar un conjunto de claves cifradas en el servidor.
"¿Este diseño de cifrado del lado del cliente es seguro?"
discute algunas de las implicaciones.