如何将私有加密用户数据存储在数据库中,但是将其提供给其他选定用户?

时间:2011-09-23 13:20:22

标签: encryption hash security lamp password-protection

首先,如果我的问题听起来有点混乱,我道歉,我会尽力详细描述我的情景:

我有一个网站,用户可以在其中输入自己的个人资料。它们主要是健康数据,因此它是非常私密和敏感的信息。因此,我需要在服务器上加密这些数据,即使服务器受到损害,这些数据也会受到保护,因为它们将使用每个用户的密码进行加密。当然,用户密码不会作为清晰文本存储在服务器上,只会存储密码哈希值。

但我的问题是,当用户可以选择与其他用户分享他/她的某些信息时,该网站将提供“社交功能”。但这会有问题,因为我无法解密用户私有数据,所以我无法将其显示给其他用户。

你能给我一些选择,或者至少是想法,怎么能解决这个问题?优选使用LAMP环境。

1 个答案:

答案 0 :(得分:21)

这可以使用public-key cryptography来解决:

  1. 为每个用户生成公钥/私钥对;并且只使用用户密码临时解密私钥。
  2. 对于每个数据项,随机选择(对称)密钥 S 并使用它加密数据 d 。商店S(d)。
  3. 使用您要授予访问权限的用户的公钥P + u 加密S.最初,那是您正在存储其数据的用户 u
  4. 永久存储P + u (S)。忘掉所有其他钥匙。
  5. 现在,当用户 u 想要与用户 x 共享数据时,请执行以下操作:

    1. 使用用户密码解密用户的私钥P - u
    2. 使用该私钥解密存储的数据:P - u (P + u (S ))= S。
    3. 使用您要与之共享信息的用户的公钥加密 S
    4. 永久存储生成的P + x (S)。忘掉所有其他钥匙。
    5. 现在,当任何用户 x 想要访问数据时,请执行以下过程:

      1. 使用用户密码解密用户的私钥P - x
      2. 找到P + x (S)。 (如果没有存储,则表示没有人与穷人x共享数据。)
      3. 使用私钥解密存储的数据:P - x (P + x (S ))= S。
      4. 使用 S ,解密存储的加密S(d):S(S(d))= d。