Cómo implementar el algoritmo de intercambio secreto de shamir usando AES_ENCYRPT

1

Estoy usando MySQL AES_ENCRYTP() y AES_DECRYPT() para almacenar detalles confidenciales en una base de datos, y actualmente estoy almacenando la clave en un archivo php fuera de la raíz web con acceso de lectura solamente. El archivo clave parece:

<?php
    define("CRYPTO_KEY", "SOME-LONG-KEY-HERE");
?>

Después de leer más, la gente recomienda que la clave debería SOLAMENTE existir en la memoria y usar algo como Compartir en secreto de Shamir Artículo de WikiPedia .

¿Cómo funcionaría esto en mi caso con php , y dónde almacenaría la clave en la memoria?

Gracias por la ayuda.

    
pregunta Justin 12.06.2013 - 02:31
fuente

2 respuestas

2

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.

    
respondido por el TildalWave 13.07.2013 - 03:03
fuente
0

Estás haciendo un par de preguntas aquí, una sobre AES y otra sobre esquemas secretos para compartir. Son tecnologías ortogonales, por lo que, en teoría, puede cifrar el archivo de clave utilizando AES [con una clave diferente] y compartir el resultado mediante un esquema de intercambio secreto. Parece que un esquema de ajuste de clave podría estar en la línea de lo que estás buscando. Pero entonces la pregunta es cómo almacenar la clave de cifrado de clave, etc.

    
respondido por el pg1989 13.06.2013 - 00:15
fuente

Lea otras preguntas en las etiquetas