Как зашифровать определенный столбец в таблице 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 зашифрованные столбцы


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