在数据库表之间提供匿名性

时间:2018-01-26 04:34:01

标签: mysql database database-security

我有一个MySQL表,其中包含用户的姓名,电子邮件地址等(table 1)。我还想要另一个表(table 2),其中存储了用户生成的但是要匿名的数据(例如工作场所评论)。

如果有人访问我的数据库,我不希望他们能够轻松地将table 1中的个人与table 2中的数据相关联。显然,我需要能够在表之间进行通信,以便将用户与他/她的数据相关联(例如,如果他们想要编辑或删除评论)。

我明白完全失败是不可能的,但最佳做法是什么?

加密table 2中的用户名是否值得?显然,加密密钥会存储在服务器的某个地方,但至少会带来额外的障碍。

我考虑过在table 2中对用户ID进行哈希处理,以便可以从table 1查询,但无法从table 1查询table 2。这是明智的吗?我不能确定将来我不想从table 1查询table 2,这将阻止我这样做。

1 个答案:

答案 0 :(得分:0)

有许多解决方案可以单独使用或相互协调使用。

列级加密

您也可以在两个表中使用单独的密钥加密数据,但是在连接两个表时您将无法使用索引。

SELECT AES_ENCRYPT(TABLE1.COLUMN1, 'table1key');
SELECT AES_ENCRYPT(TABLE2.COLUMN2, 'table2key');

因此,在您的方案中TABLE1.COLUMN1TABLE2.COLUMN2是两个表之间的链接。您可以使用不同的密钥对它们进行加密,然后在应用程序检索信息时,您可以再次使用密钥对它们进行解密。它会增加相当大的开销,请记住。

列级数据库权限

您可以通过执行此操作将表格中特定列的访问权限授予任何人

GRANT SELECT ON TABLE1 (COLUMN1, COLUMN2, COLUMN8, COLUMN9) TO USERNAME@HOST;

存储过程/函数

尽管存储过程存在缺点,但MySQL并未将查询缓存在存储过程中,但它确实提供了抽象。运行代码的人不需要SELECT访问数据库。他们只需要EXECUTE访问该存储过程。这样您就可以显示所需的结果。