2010-11-25 3 views
12

Я экспериментирую с созданием простой страницы сообщений (PHP), которая использует таблицу MySQL для хранения записей. Грубый набросок колонн я буду использовать в таблице:Как зашифровать определенный столбец в таблице MySQL?

MSG_ID (первичный ключ, auto_increment)

user_id (внешний ключ, указывающий на пользователя, создавшего сообщение)

время (запись DATETIME, чтобы обеспечить временные метки MSG)

Сообщ (а УАКСНАК содержащий MSG)

, доступную (просто Int (1), 0 означает, что нет никого, кроме пользователя, сам может читать сбщ и 1 означает, другие могут прочитать его)

Что мне интересно, что это лучший способ шифрования поля msg, так что любопытные глаза не могут его прочитать (скажем, открыв mysql CLI или phpMyAdmin и просто прочитав значение, хранящееся в строке)?

Если для параметра «accessable» установлено значение 0, то только его пользователь должен иметь возможность прочитать его (путем доступа к некоторой странице PHP), но если он установлен в 1, все остальные должны иметь возможность читать его , Я не знаю, как это решить, поэтому любая помощь очень ценится!

ответ

19

Посмотрите здесь список возможных функций шифрования:

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

Вы можете создать триггер для обновления и проверить там поле accessable. Нечто подобное:

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; 

Вы также можете обновить все существующие записи в вас таблице с этим запросом:

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

Таким образом, вы можете выбрать записи для вас PHP код:

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

UPD. Также здесь был подобный вопрос:

MySQL encrypted columns

+7

Не так ли странно положить ключ в триггер? если вы получите доступ к db, он сможет увидеть ключ и дешифровать данные ... – Roey 2015-01-26 09:06:00

+1

Я согласен с прохождением ключа @Roey в триггере, сделает все, что бесполезно. – 2016-02-03 06:56:42

6

Вы также можете зашифровать данные до запроса, чтобы вставить его, так что MySQL даже не знаю он зашифрован, и расшифровать его поиска в заявление. Для этого вам следует сохранить его в столбце varbinary или blob.

Смежные вопросы