Как зашифровать определенный столбец в таблице MySQL?
Я экспериментирую с созданием простой страницы сообщений (PHP), которая использует таблицу MySQL для хранения записей. Грубый контур столбцов, которые я буду использовать в таблице, это:
msg_id (первичный ключ, auto_increment)
user_id (внешний ключ, указывающий на пользователя, создавшего сообщение)
время (запись DATETIME для предоставления временных меток msg)
msg (VARCHAR, содержащий msg)
доступный (просто int (1), 0 означает, что никто, кроме самого пользователя, не может прочитать msg, а 1 означает, что другие могут его прочитать)
Мне интересно, что лучший способ зашифровать поле msg, чтобы любопытные глаза не могли его прочитать (скажем, открыв mysql CLI или phpMyAdmin и просто прочитав значение хранится в строке)?
Если для параметра "accessable" установлено значение 0, то только тот пользователь должен иметь возможность читать его (путем доступа к некоторой странице PHP), но если он установлен в 1, все остальные должны иметь возможность читать его. Я не знаю, как справиться с этим, поэтому любая помощь очень ценится!
Ответы
Ответ 1
Посмотрите список возможных функций шифрования:
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
Ответ 2
Вы также можете зашифровать данные перед запросом, чтобы вставить их, чтобы MySQL даже не знал, что он зашифрован, и расшифруйте его при поиске в приложении. Для этого вам следует сохранить его в столбце varbinary или blob.