Подтвердить что ты не робот

Как зашифровать определенный столбец в таблице 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, все остальные должны иметь возможность читать его. Я не знаю, как справиться с этим, поэтому любая помощь очень ценится!

4b9b3361

Ответ 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.