【问题标题】:How to obfuscate relationship between 2 users in db?如何混淆数据库中2个用户之间的关系?
【发布时间】:2019-07-15 17:19:22
【问题描述】:

我在我的 SQL 表中存储了 2 个用户之间的相互友谊。 一行看起来像

friendship_id | user_id_1 | user_id_2

(为简单起见,我选择了存储

friendship_id | user_id_2 | user_id_1

同样)

我的问题是:万一发生泄漏,黑客将拥有此表,以及将 user_id 与电子邮件地址和其他用户数据相关联的表,使他能够将姓名放在友谊上。 我真的想避免:我不想让任何人知道谁是谁的朋友。所以我想加密/散列/混淆/匿名这个表中的user_id(使其在泄漏的情况下无用)。

我在想类似的东西

friendship_id | hashed_user_id_1 | hashed_user_id_2

我的推理正确吗? 如果是这样,实现它的正确方法是什么? (我正在使用 PHP)。

我正在考虑使用 password_hash 函数,但我不确定使用 password_verify 时我的 SQL 查询会是什么样子。

或者也许使用多次迭代的 sha256 + 独特的盐就足够了? 但是,这是否意味着我必须为每个友谊生成和存储一个独特的盐?

【问题讨论】:

  • 这不会解决你的问题,因为散列的用户 ID 仍然是相同的,黑客可以追踪哪个用户拥有该散列用户 ID。
  • 如何开发这将取决于您需要能够对 SQL 表执行什么操作。服务器必须能够回答哪些问题?例如,您是否需要以下各项: user1 和 user2 是否链接?列出来自 user1 的所有链接。列出所有指向 user1 的链接。你心目中的攻击类型是什么?您是否试图确保专门的攻击者无法找到给定用户的单个链接?还是专门的攻击者无法验证提议的链接?或者一个随意的攻击者不能轻易地抓住所有的链接?这些都对您如何设计解决方案非常重要。
  • (对于上述问题,请将 服务器 必须能够执行的操作与客户端必须能够处理恰好位于服务器上的数据执行的操作分开。Afshin 的回答如果服务器不必进行任何处理,那么它就在正确的轨道上,但如果服务器确实必须独立于客户端进行处理,它就无济于事。)
  • 这可能在security.stackexchange.com上问得更好

标签: encryption hash privacy


【解决方案1】:

我认为你的方法不会解决任何问题,因为黑客可以使用散列值来查找用户。

我的建议:尽量将所有明确的关系数据保存在客户端

这是什么意思?这意味着如果攻击者访问服务器,他无法从关系中获取用户。这意味着代码将更复杂,但更安全。

你是如何实现的?

这只是我的想法,因此人们需要对此进行更多分析。但这里有一个快速的解决方案:

1-从用户密码创建密钥:这可以通过例如基于 PKCS5 密码的密钥生成来完成。假设密钥是K。 2-使用K(例如使用javascript)在客户端加密用户关系。然后将friendship_id 添加到您的数据中。你会得到这样的数据:

DATA = friendship_id || ENC(user_id_2 || user_id_1 || random_nounce, K)

3-将DATA保存在服务器SQL上,所以当你需要获得友谊时,你可以找到DATAfriendship_id。 4-当用户想要查看好友列表时,他只需在客户端解密DATA 并获得他的好友用户ID 列表。现在他将发送单独的请求以获取这些用户 ID 的信息。

使用这种方法,由于朋友的用户ID在服务器上被加密,黑客无法看到他们。

如果您在客户端不需要任何东西,则可以使用存储过程来实现某些目标。将朋友用户 ID 加密存储在服务器上,并使用存储过程通过客户端传递 friendship_idK 来获取它们。

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 2015-02-21
    • 1970-01-01
    • 2017-01-21
    • 2021-06-05
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多