我有一个MySQL表,其中包含用户的姓名,电子邮件地址等(table 1
)。我还想要另一个表(table 2
),其中存储了用户生成的但是要匿名的数据(例如工作场所评论)。
如果有人访问我的数据库,我不希望他们能够轻松地将table 1
中的个人与table 2
中的数据相关联。显然,我需要能够在表之间进行通信,以便将用户与他/她的数据相关联(例如,如果他们想要编辑或删除评论)。
我明白完全失败是不可能的,但最佳做法是什么?
加密table 2
中的用户名是否值得?显然,加密密钥会存储在服务器的某个地方,但至少会带来额外的障碍。
我考虑过在table 2
中对用户ID进行哈希处理,以便可以从table 1
查询,但无法从table 1
查询table 2
。这是明智的吗?我不能确定将来我不想从table 1
查询table 2
,这将阻止我这样做。
答案 0 :(得分:0)
有许多解决方案可以单独使用或相互协调使用。
您也可以在两个表中使用单独的密钥加密数据,但是在连接两个表时您将无法使用索引。
SELECT AES_ENCRYPT(TABLE1.COLUMN1, 'table1key');
SELECT AES_ENCRYPT(TABLE2.COLUMN2, 'table2key');
因此,在您的方案中TABLE1.COLUMN1
和TABLE2.COLUMN2
是两个表之间的链接。您可以使用不同的密钥对它们进行加密,然后在应用程序检索信息时,您可以再次使用密钥对它们进行解密。它会增加相当大的开销,请记住。
您可以通过执行此操作将表格中特定列的访问权限授予任何人
GRANT SELECT ON TABLE1 (COLUMN1, COLUMN2, COLUMN8, COLUMN9) TO USERNAME@HOST;
尽管存储过程存在缺点,但MySQL并未将查询缓存在存储过程中,但它确实提供了抽象。运行代码的人不需要SELECT
访问数据库。他们只需要EXECUTE
访问该存储过程。这样您就可以显示所需的结果。