我应该如何安全地将加密的用户数据存储在我的服务器上,并仅将其提供给正确的用户?

时间:2010-09-06 07:01:10

标签: security authentication encryption passwords authorization

我们假设我必须存储用户的敏感数据,这些数据可选择在客户端加密。

  • 加密(可选)应使用用户的密码短语完成。
  • 用户登录(可选)应使用用户的密码完成。

注意:
明文密码不存储在服务器上或通过网络传输。

我的选择及其缺点:

1。无身份验证,客户端授权:
服务器将数据提供给每个人,但只有原始用户才有解码的方法 任何人都可以使用数据来尝试破解加密 - 而不是保护加密的最佳方式。

2。服务器端身份验证,无需授权:
服务器存储用户密码以访问数据,并仅向用户提供可提供正确密码的数据 用户不相信网络传输数据没有加密

第3。身份验证和授权:
服务器存储用户密码以访问加密数据,加密使用与用户密码不同的密码完成。
安全性良好,但用户不想记住两个密码

4。身份验证与授权: 服务器存储用户密码以访问加密数据,加密使用相同的密码完成 用户很高兴。一些安全问题。

我更喜欢最新的第四种选择,但我担心的是:
如果服务器受到损害怎么办?如何确保加密密码和加密数据不能一起用来破解加密? 如何才能更难打破加密?

一些想法:

  • 对密码和数据使用不同的加密算法。
  • 在加密前将固定字符串添加到用户密码的末尾。
  • 将用户的密码填充一段时间。

修改

系统应该非常类似于应该从各方面保护的备份系统:服务器不应该能够读取数据,只有原始客户端应该能够访问数据而中间人应该是被阻止。因此,如果有人破解服务器身份验证或客户端加密,则不应泄露数据。

它应该是基于网络的,因此应该使用HTTPS阻止中间人攻击。

为防止服务器黑客泄露数据,数据在客户端加密。

为了防止客户端加密篡改,应该在服务器端保护对数据的访问,并使用一些登录和密码或令牌(可能是唯一的URL)。

3 个答案:

答案 0 :(得分:7)

@Vitaly,允许我在回答之前澄清一些术语,因为你似乎对某些术语使用了与常用术语不同的含义。

Authentication - 证明你是谁的过程(更准确地说,你拥有你声称的身份)。
Authorization - 用于限制,控制和授予访问权限的机制 Encryption - 一种保护数据的机制,甚至是有权访问数据的人。

现在,请允许我重新定义您的选项,然后我会建议其他内容:

  1. 无身份验证,无授权,客户端加密
  2. 服务器端身份验证,服务器端授权,服务器端加密
  3. 服务器端身份验证,服务器端授权,客户端加密
  4. 服务器端身份验证,服务器端授权,使用服务器凭据的客户端加密。
  5. 现在,我认为每个人站在哪里都可以更清楚 一般来说,你真的想要遵循“最佳实践”(不要让我开始那些)“深度防御”的原则,即不要只使用加密,或只使用访问控制,而是使用两者!但是,正如您所指出的,这可能与另一个原则“保持安全性简单”相反(如果用户需要记住 TWO 密码)。

    在没有尝试太烦人的情况下,您没有提供有关环境的大量信息。例如,这是例如一个Web应用程序?如果是这样,为什么SSL / TLS不足以为您加密?或者这是用户上传您(和您的系统)不应该看到的个人数据的问题(例如备份类型的服务)?在这种情况下,客户端加密是必要的......

    所以,(最后)我建议的选项,取决于您的环境/要求:

    1. 如果可以,请依靠安全协议(例如SSL / TLS)进行加密。使用服务器端身份验证+授权,协议加密。
    2. 如果您的系统需要进一步保护此数据,例如信用卡(请注意,我目前不是PCI:QSA;)),使用上一个选项,另外使用服务器生成的加密密钥(不是密码)进行服务器端加密(当然保护密码)。< / LI>
    3. 如果数据需要从您的系统受到保护,您需要对服务器端身份验证+授权进行客户端加密(附加3,因为我重新进行了更新)。 但是,您不一定需要强制用户记住其他密码/短语。同样,根据您的环境,您可能会考虑存储在客户端上的某种形式的密钥,例如用户证书存储区/密钥环中的证书,甚至存储在受保护的配置文件中;一个基于生物识别数据的密钥(不容易,但我已经看到这个成功完成,虽然它有自己的一套问题),带外密钥分发(例如通过手机)等。这将使你们两个都能使用强密钥,防止服务器访问这些密钥,不要求用户记住两个密钥,并且不会在不同的上下文中为不同的用法重复使用单个密码。

答案 1 :(得分:3)

您可以查看用于身份验证的零知识协议,尤其是Secure Remote Password protocol,这样就可以在不泄露服务器密码的情况下执行基于密码的身份验证。这样,相同的密码既可用于认证,也可用于导出数据加密密钥。 此外,您可以查看Clipperz在线服务,该服务实现类似于您的需求并且也是开源的。

答案 2 :(得分:1)

使用选项1并使数据的URL包含一个长随机字符串。知道随机字符串的任何人都可以获取数据。当然,只有创建数据的客户才会立即关闭该URL。

如果有人想让其他人获得可撤销的访问权限,请允许他们生成新的随机网址,并为他们提供一种方法,让他们为该随机网址命名并撤消其获取数据的能力。

Capability based security更容易正确,更灵活,对用户更有意义。有一个really excellent YouTube video about capability based security和一个nice website with some essays about it