2010-11-25 20 views
12

我正在尝试创建一个简单的消息系统(PHP)页面,该页面使用MySQL表来存储条目。列的粗略的轮廓,我会在表中使用是:如何加密MySQL表中的特定列?

MSG_ID(主键,AUTO_INCREMENT)

USER_ID(外键指向谁创造了消息的用户)

时间(一个DATETIME条目提供MSG时间戳)

MSG(含有MSG一个VARCHAR)

accessable(只是一个int(1),0表示任何人,除非用户自己可以读取味精,和1意味着其他人可以阅读它)

什么我不知道是什么是最好的方式来加密msg字段,所以窥探的眼睛无法读取它(比方说,打开mysql CLI或phpMyAdmin,只读取存储在一行中的值)?

如果“可访问”设置为0,那么只有用户本人应该能够读取它(通过访问某个PHP页面),但如果设置为1,其他人都应该能够读取它。我不知道如何解决这个问题,所以任何帮助都非常感谢!

回答

19

在这里寻找可能的加密功能列表:

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 encrypted columns

+7

把钥匙放在触发器中是不是有点奇怪?如果有人进入数据库,他将能够看到密钥并解密数据... – Roey 2015-01-26 09:06:00

+1

我同意@Roey传递键的触发器,将使所有无用的东西。 – 2016-02-03 06:56:42

6

您也可以加密之前的查询,将其插入数据,从而使MySQL不连知道是加密的,并在解密上检索应用。为此,您应该将其存储在varbinary或blob列中。