2011-10-26 24 views
6

Necesito una forma de almacenar datos encriptados, de manera que aún puedo ejecutar consultas. ¿Es eso posible?¿Cómo almacenar datos encriptados 'consultables' en MySQL?

Al menos necesito un algoritmo de encriptación que siempre devuelve la misma cadena para la misma entrada, para que pueda encontrar todos los usuarios llamados 'John' encriptando esa cadena y buscando el resultado encriptado en la base de datos. En PHP, mcrypt siempre devuelve diferentes cadenas (sé que esto es a propósito, para mejorar la seguridad).

¿Alguna idea?

+1

Para almacenar datos encriptados en mysql, sería necesario descifrarlos (suponiendo que esto se hizo con mysql not php) para realizar la búsqueda de palabra clave. Esto sería increíblemente lento ya que incluso los índices no podrían ayudarte entonces. –

+0

Tengo una idea de preguntarte por qué necesitas almacenar datos encriptados. –

+0

Porque son datos que solo deberían ser leíbles para las personas que han sido autorizadas en la aplicación web (no en el DB). Muchas personas trabajan con este DB y tienen acceso de lectura. – HappyDeveloper

Respuesta

8

Depende de cómo se almacena el nombre 'John'. Si es la única cosa en un campo determinado, puede hacer algo como

SELECT ... 
FROM sometable 
WHERE cryptedfirstname = AES_ENCRYPT('John', $key) 

Si 'John' es parte de una cadena más grande ('John Doe' o 'el rey Juan, Rey del Universo'), entonces que tendrá que descifrar todo el campo y el partido contra el que

SELECT ... 
FROM sometime 
WHERE INSTR(AES_DECRYPT(cryptedFULLame, $key), 'John') > 0 

Nota que estoy incorporación de la clave de descifrado en la consulta. Mala idea para un sistema de producción, pero esto es solo un ejemplo.

Usted no será capaz de hacer algo como:

... 
WHERE INSTR(cryptedFULLname, AES_ENCRYPT('John', $key)) 

debido a la forma en AES y otra más decente trabajo Userful/sistemas criptográficos.

+0

Gracias, muy útil. Algún idiota, te dijo, claramente no entendió el problema. +1 – HappyDeveloper

+0

No hay biggies. Los votos hacia abajo vuelan rápido y grueso aquí. Y, francamente, -1 no hace mucha diferencia en este punto ... –

+1

El voto a favor no fue mío, pero puede haber sido de alguien que entiende que una buena seguridad requiere un modo de cifrado con un impredecible IV. Todos los ejemplos aquí carecen de eso. – erickson

2

Parece que usted entiende esto, pero debe enfatizarse que un algoritmo de encriptación que siempre produce el mismo texto de cifrado para un texto plano dado se rompe. Lleva a todo tipo de ataques.

Por ejemplo, un atacante con acceso a su base de datos y la aplicación puede elegir el valor "John" para un campo y hacer que la aplicación lo almacene en la base de datos. Luego puede mirar el texto de cifrado de su registro e identificar cualquier otro registro que contenga ese texto de cifrado. Él no necesita obtener la clave para esto.

Una excepción sería si está encriptando números únicos grandes e "impredecibles", por ejemplo, identificadores de sesión o UUID. En este caso, dado que los textos sin formato no se repiten, y los textos planos válidos no pueden ser pronosticados por un atacante, no se requiere la distinción de texto cifrado.

Cualquier cifrado simétrico utilizado en modo ECB producirá texto cifrado coherente a partir de un texto sin formato, al igual que los modos que toman un vector de inicialización si siempre usa el mismo IV. En general, no es una buena idea hacer esto.

+0

Es bueno saberlo, gracias. Bueno, alguien más en la empresa tendrá que lidiar con esto = p, yo no diseñé el sistema. +1 – HappyDeveloper

Cuestiones relacionadas