【问题标题】:Providing anonymity between database tables在数据库表之间提供匿名性
【发布时间】:2018-01-26 04:34:00
【问题描述】:

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

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

我知道完全故障保护是不可能的,但最佳做法是什么?

加密table 2 中的用户ID 是否值得?显然,加密密钥将存储在服务器的某个位置,但它至少会提供一个额外的障碍。

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

【问题讨论】:

    标签: mysql database database-security


    【解决方案1】:

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

    列级加密

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

    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 访问该存储过程。这样您就可以显示您想要的结果。

    【讨论】:

    • 谢谢@montypython。在您的第一个解决方案中,加密密钥存储在哪里我不确定其他两个解决方案如何在我的情况下工作,因为对数据库的所有访问都是通过 PHP 的单个用户完成的。
    • @Rob - 您可以在硬编码加密/解密密钥的地方创建用于加密的 UDF,也可以将它们保存在代码中的某些配置文件中。
    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多