2010-11-25 156 views
12

Estoy experimentando con la creación de una página del sistema de mensajes simples (PHP) que utiliza una tabla MySQL para almacenar las entradas. El esbozo de las columnas voy a utilizar en la tabla son:¿Cómo encriptar una columna específica en una tabla MySQL?

msg_id (clave principal, AUTO_INCREMENT)

user_id (apuntando clave externa para el usuario que creó el mensaje)

tiempo (una entrada DATETIME para proporcionar marcas de tiempo msg)

msg (a VARCHAR que contiene el msg)

accesible (apenas un int (1), 0 significa que nadie excepto el propio usuario puede leer msg, y 1 significa que otros puedan leerlo)

Lo que me pregunto es, ¿cuál es la mejor forma de cifrar el campo msg para que las miradas indiscretas no puedan leerlo (digamos, abriendo la CLI de mysql o phpMyAdmin y simplemente lea el valor almacenado en una fila)?

Si "accesible" está configurado en 0, entonces solo el usuario debe poder leerlo (accediendo a alguna página de PHP), pero si se establece en 1, todos los demás deberían poder leerlo también. . No sé cómo abordar esto, ¡así que cualquier ayuda es muy apreciada!

Respuesta

19

Mire aquí para la lista de posibles funciones de cifrado:

http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

Puede crear disparador para actualizar y comprobar allí accessable campo. Algo así:

CREATE TRIGGER crypt_trg BEFORE UPDATE ON table FOR EACH ROW 
BEGIN 
    IF new.accessable = 0 THEN 
    SET new.msg := ENCRYPT(new.msg, 'key'); 
    ELSE 
    SET new.msg := DECRYPT(new.msg, 'key'); 
    END IF; 
END; 

También puede actualizar todos los registros existentes en su mesa con esta consulta:

UPDATE table SET msg = IF(accessable = 0, ENCRYPT(msg, 'key'), DECRYPT(msg, 'key')); 

para que pueda seleccionar registros para que el código PHP:

SELECT msg_id, user_id, time, IF(accessable = 0, DECRYPT(msg, 'key'), msg) msg 
FROM table 

UPD. También aquí fue pregunta similar:

MySQL encrypted columns

+7

¿No es un poco raro poner la llave en el gatillo? si uno tiene acceso a la base de datos, podrá ver la clave y descifrar los datos ... – Roey

+1

Estoy de acuerdo con @Roey al pasar la llave en el gatillo, hará que todo sea inútil. –

6

También puede cifrar los datos antes de la consulta para insertar, por lo que MySQL no tiene ni siquiera sabe está encriptado, y descifrarlos en la recuperación de la solicitud. Para eso, debes guardarlo en una columna varbinary o blob.

+0

Un blob suena como un tipo de datos decente para esta área de uso en particular. Si puedo preguntar, ¿podrías aclarar tu primera oración? Al usar blobs, ¿cómo se llevaría a cabo la desencriptación? Si el administrador de MySQL sabe que el tipo de datos es un blob, ¿no puede simplemente descifrarlo manualmente para leer los contenidos? – BeeDog

+1

Encriptación: si conoce la clave, puede descifrar los datos.Si su administrador de MySQL tiene acceso a la clave utilizada para encriptar la información, entonces, por supuesto, también puede descifrarla. Eso es cierto para todos los métodos que puedas usar. En cuanto a cómo encriptar, eso depende completamente de su aplicación y la funcionalidad que proporciona, y qué algoritmos elige usar. –

Cuestiones relacionadas