我正在尝试在MySQL和PHP中实现数据匿名化。
目前,我正在通过使用用户密码加密外键/ID来分离数据,并将其保存在"用户"帐户表中。但我很快意识到,当一个用户最初创建时,我将第一个数据插入其他表中,我可以通过行数将它们匹配在一起。
我想做的是在每次创建新帐户时随机交换用户帐户的详细信息,但这感觉效率很低。
我在网上找不到任何相关的东西,比如关于如何正确实现用户数据分离以使其完全匿名的基本解释。有人能在这里解释一下在RDBMS体系结构中实现数据匿名化的方法吗?
提前感谢!
编辑:
为了更清楚,让我们假设我有两张表:一张是用户电子邮件&加密的唯一外部密钥(帐户表(。另一个保存用户偏好/信息(此表将始终为每个用户保存1行(。
现在假设我在account表中添加了一个新用户,并在userpreference/info表中添加数据。事实上,我仍然可以通过计算表行来知道这些信息是否为该用户所有。
我无法加密所有这些数据,因为其中一些数据可能是匿名公开的。即便如此,使行彼此不相关仍然会使任何人都更难掌握这些加密数据,从而无法将其与任何用户进行匹配。
我正在寻找完全匿名和隐私,不仅通过加密,而且通过分离用户数据。我希望数据对用户来说是完全私有的——可能不会在多个地方复制任何数据。
在这种情况下,随机交换会是最好的方案吗?(复制随机选择的用户,并交换/覆盖其原始行中的新数据(
您需要关注差异隐私。这里的想法是将原始数据保存在一个记录中,但添加看起来非常相似的精心随机的数据
例如,假设您正在存储用户的出生年份。如果你添加一个单独的用户记录和一个不相关的单独的出生年份记录,你很可能(正如你所说(能够扭转关系并重新将两者联系起来。然而,您可以添加多个随机值聚集在真实值周围的记录(但不完全集中,因为这在统计上也是可逆的(,因此您可以将1970年出生的user1
添加到1968年、1969年、1970年和1971年的记录中,1980年生产的user2
的值可以为1979年、1980年、1981年和1982年。然后,您无法准确判断哪条记录是正确的,但平均值是合理正确的。请注意,这甚至适用于单个记录。
但这里还有一个更令人担忧的问题——您希望记录的匿名程度到底是多少?你需要的匿名程度可能取决于你处理的数据的性质。这个简单的例子只关注一个字段——当单独使用时,这个字段可能确实不允许重新标识,但当与其他字段组合时,即使它们使用类似的方法,也可能提供足够的信息。
正如你所知,这是一件很难有效设计的微妙事情——计算你需要添加多少噪音的算法赢得了数学奖牌!
另一种方法是使用同态加密来保存真实数据,而不知道它是什么,这样你仍然可以做搜索之类的事情,但实际上无法看到底层数据。
由于您使用的是PHP,您可能会发现CipherSweet提供了一个有用的工具包。