Encryption 如何在数据库中存储私有加密用户数据,但使其可供其他选定用户使用?

Encryption 如何在数据库中存储私有加密用户数据,但使其可供其他选定用户使用?,encryption,hash,security,lamp,password-protection,Encryption,Hash,Security,Lamp,Password Protection,首先,我很抱歉,如果我的问题听起来有点混乱,我会尽可能详细地描述我的情况: 我有一个网站,用户可以输入自己的个人资料。它们主要是健康数据,因此是非常隐私和敏感的信息。因此,我需要在服务器上加密这些数据,即使服务器受到威胁。这些数据是安全的,因为它们将使用每个用户的密码进行加密。当然,用户密码不会以明文形式存储在服务器上,只有密码散列 但我的问题是,当用户可以选择与其他用户共享他/她的一些信息时,该网站将提供“社交功能”。但这将是一个问题,因为我无法解密用户的私有数据,所以我无法将其显示给其他用户

首先,我很抱歉,如果我的问题听起来有点混乱,我会尽可能详细地描述我的情况:

我有一个网站,用户可以输入自己的个人资料。它们主要是健康数据,因此是非常隐私和敏感的信息。因此,我需要在服务器上加密这些数据,即使服务器受到威胁。这些数据是安全的,因为它们将使用每个用户的密码进行加密。当然,用户密码不会以明文形式存储在服务器上,只有密码散列

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

你能给我一些选择,或者至少一些想法,如何解决这个问题?最好使用灯环境。

这可以通过以下方法解决:

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

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

  • 使用用户密码解密用户的私钥P-x
  • 找到P+x(S)。(如果未存储,则意味着没有人与可怜的用户x共享数据)
  • 使用私钥解密存储的数据:P-x(P+x(S))=S
  • 使用S解密存储的加密S(d):S(S(d))=d

  • 谢谢你的解决方案。我读了5遍才完全消化,但这正是我想要的,谢谢。@Frodik抱歉,我知道它很复杂,可以通过省略所有变量使它看起来更简单,但这会使它非常不精确。顺便说一句,看看实际实现此解决方案的模块。@Frodik openssl模块包含一个函数列表,每个函数的签名都有文档记录。我很抱歉,但因为我倾向于放弃教程,所以我什么都不知道。不过,我有一个跟进问题。如果用户忘记/丢失密码,他/她的所有数据将永远消失,并且没有办法恢复,对吗?我正在考虑实现某种“丢失密码”功能,用户可以将新密码发送到其注册的电子邮件地址。然而,我看不出有什么办法可以做到这一点……但根据您的说法,解密数据需要纯文本密码,这意味着用户在每次页面加载时重新输入密码,或者密码存储在客户端机器或服务器机器上的某个变量专用对象中(流#1)。现在,您说您可以将密码作为普通密钥存储在另一台机器上,然后您需要提供一些短凭据或API,以便从主服务器访问该服务器。现在,如果主服务器受到危害,那么,在这种情况下,专用服务器也会受到危害。