web-dev-qa-db-ja.com

MySQLテーブルの特定の列を暗号化する方法は?

MySQLテーブルを使用してエントリを格納する単純なメッセージシステム(PHP)ページを作成する実験を行っています。表で使用する列の概要は次のとおりです。

msg_id(主キー、auto_increment)

ser_id(メッセージを作成したユーザーを指す外部キー)

time(メッセージのタイムスタンプを提供するDATETIMEエントリ)

msg(メッセージを含むVARCHAR)

アクセス可能(単なるint(1)、0はユーザー自身がメッセージを読むことができることを除いて誰もいないことを意味し、1は他の人がメッセージを読むことができることを意味します)

私が思っているのは、詮索好きな目がそれを読み取れないようにmsgフィールドを暗号化する最良の方法は何ですか(たとえば、mysql CLIまたはphpMyAdminを開いて、行)?

「アクセス可能」が0に設定されている場合、(一部のPHPページにアクセスすることにより)ユーザー自身のみがそれを読むことができますが、1に設定されている場合、他のすべてのユーザーができるはずです。私もこれに取り組む方法がわからないので、どんな助けでも大歓迎です!

16
BeeDog

可能な暗号化関数のリストについては、こちらをご覧ください:

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暗号化列

20
rMX

クエリの前にデータを暗号化して挿入することもできます。これにより、MySQLはknowでも暗号化せず、アプリケーションでの取得時に復号化します。そのためには、それをvarbinary列またはblob列に格納する必要があります。

8
Core Xii