Как зашифровать определенный столбец в таблице MySQL? - PullRequest
12 голосов
/ 25 ноября 2010

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

msg_id (первичный ключ, авто_инкремент)

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

время (запись DATETIME для предоставления меток времени сообщения)

msg (VARCHAR, содержащий msg)

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

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

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

Ответы [ 2 ]

20 голосов
/ 25 ноября 2010

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

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

6 голосов
/ 25 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...