La aplicación escrita en PHP puede hacerse persistente en la memoria, es decir, ejecutarse como un servicio y responder a solicitudes de otro proceso local que sea o no sea persistente, por ejemplo, utilizando FastCGI Process Manager . No soy un gurú de PHP, pero los módulos FastCGI son estándar en muchas plataformas con las que he trabajado antes, por lo que debería ser lo mismo. En pocas palabras, utilizando FastCGI debería poder ejecutar un servicio persistente de memoria (o un trabajador de Apache) que escucha en un puerto específico las solicitudes HTTP y envía las respuestas HTTP a la aplicación web del llamante. Así es como me gustaría escribir tu Compartir Secreto de Shamir:
Escriba un servidor de claves con memoria persistente que usará una contraseña ( key A
) como una entrada de la aplicación web de la persona que llama y otra contraseña ( key B
) que ingresó durante Inicialización de la aplicación del servidor clave. Puede habilitar el ingreso de este key B
remoto habilitado o solo local, pero esto puede hacerse con el mismo formulario de ingreso de contraseña y simplemente configurar su firewall de acuerdo a sus necesidades. Luego concatene estas dos claves A+B
y haga hash de este valor (por ejemplo, bcrypt, lo que en PHP se denomina CRYPT_BLOWFISH
, en cualquier caso use un algoritmo de hashing lento para obtener protección adicional contra los ataques de fuerza bruta) para obtener el key C
que obtiene. Se utilizará para descifrar una base de datos cifrada AES key D
almacenada en un archivo local. Suelte (sobrescriba con una tontería aleatoria o anule) su variable key B
, pero mantenga key A
y key C
en la memoria.
Utilizará key A
para verificar las solicitudes locales subsiguientes de su aplicación web no persistente (puede hacer hash de este valor, pero usar un algoritmo de hashing lento no tiene mucho sentido con las solicitudes frecuentes, y los algoritmos de hashing rápido no funcionarán » t ayuda mucho), y use key C
para descifrar la base de datos almacenada localmente key D
que necesita enviar de vuelta a la aplicación web autenticada. Aloja esta aplicación de servidor clave como un trabajador FastCGI Apache, configura el puerto en el que debe responder a las solicitudes HTTP (no a los puertos HTTP (S) 80
, 8080
o 443
), y configura tu firewall solo para responda a las solicitudes remotas en este puerto seleccionado para la URL de entrada key B
, mientras que la URL de recuperación key D
de la base de datos solo debe ser accesible localmente en el mismo servidor web.
Luego genere su archivo de clave de base de datos cifrada. Decida dos contraseñas aleatorias key A
y key B
, genere key C
como un hash bcrypt de las dos claves concatenadas A+B
, y use este key C
para cifrar su base de datos key D
, y almacénelo en un archivo accesible localmente. Almacene key A
, ya que lo usará en sus aplicaciones web escritas de PHP para recuperar y memorizar o almacenar de manera segura key B
. La contraseña protege / encripta su base de datos usando key D
y ya está listo.
Este enfoque es, en esencia, un 2FA , donde la clave de la base de datos solo se guarda en la memoria, o fuertemente cifrada en un archivo local, y la clave de descifrado nunca se envía en su totalidad por un solo modo de entrada. Si el atacante obtiene una retención de todos menos una parte de este llavero, o incluso crea una copia completa de los archivos, aplicaciones y la base de datos alojados en su servidor web, no podrá descifrar su base de datos. Por supuesto, su enfoque es sensato y utiliza algoritmos de cifrado y hash de contraseña sólidos.