Как зашифровать определенный столбец в таблице MySQL?
я экспериментирую с созданием простой страницы системы сообщений (PHP), которая использует таблицу MySQL для хранения записей. Грубый контур столбцов, которые я буду использовать в таблице:
параметр msg_id (первичный ключ, типа AUTO_INCREMENT)
ид_пользователя (внешний ключ, указывающий на пользователя, создавшего сообщение)
времени (запись DATETIME для предоставления меток времени msg)
msg (VARCHAR, содержащий мгзс)
доступна (просто int (1), 0 означает, что никто, кроме самого пользователя, не может прочитать msg, а 1 означает, что другие могут прочитать его)
Мне интересно, каков наилучший способ шифрования msg поле, поэтому посторонние глаза не могут его прочитать (скажем, открыв MySQL CLI или phpMyAdmin и просто прочитав значение, хранящееся в строке)?
Если "accessable" установлен в 0, то только пользователь сам должен иметь возможность прочитать его (путем доступа некоторые страницы PHP), но если установлено значение 1, все остальные также должны иметь возможность читать его. Я не знаю как справиться с этим, поэтому любая помощь очень ценится!
2 ответов
посмотрите здесь для списка возможных функций шифрования:
http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html
вы можете создать триггер для обновления и проверить есть поле accessable
. Что-то вроде этого:--5-->
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 даже не знаю он зашифрован и расшифровывает его при извлечении в приложении. Для этого вы должны сохранить его в столбце varbinary или blob.