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

m_v*_*aly 4 security authentication encryption passwords authorization

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

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

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

我的选择和缺点:

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

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

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

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

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

一些想法:

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

编辑:

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

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

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

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

Avi*_*viD 7

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

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

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

  1. 无身份验证,无授权,客户端加密
  2. 服务器端身份验证,服务器端授权,服务器端加密
  3. 服务器端身份验证,服务器端授权,客户端加密
  4. 服务器端身份验证,服务器端授权,使用服务器凭据的客户端加密.

现在,我认为每个人站在哪里都可以更清楚.
一般来说,你真的想遵循"最佳实践"(不要让我开始那些)"深度防御"的原则,即不要只使用加密,或只使用访问控制,而是使用两者!但是,正如您所指出的,这可以与另一个原则"保持安全性简单" 相反(如果用户需要记住两个密码).

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

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

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

  • 另一个侧面点是,用户的密码永远不应该以纯文本形式存储,而应该以散列方式存储.但是,使用密码作为加密密钥需要将其用作纯文本!此外,在重新使用相同密码的同时更改算法也无济于事,不要忘记Kerckhoff定律. (2认同)

Gia*_*ale 3

您可以查看用于身份验证的零知识协议,特别是安全远程密码协议,它可以执行基于密码的身份验证,而无需向服务器泄露密码。这样,相同的密码既可用于身份验证,又可用于导出数据加密密钥。另外,您可以查看Clipperz在线服务,它实现了与您的需求类似的功能,并且也是开源的。