【发布时间】:2013-07-20 06:48:13
【问题描述】:
我正在制作一项服务,该服务将存储有关给定用户的个人数据,这些数据应该只能由作者和目标查看。我想在客户端执行加密,只在服务器上存储产生的垃圾。
互联网告诉我使用 ,这对于单个用户的数据效果很好。
问题
对于我的服务,其他用户可以输入只有他们和目标用户才能查看的数据 - 这如何通过客户端加密来实现?
是否有可能在纯粹的客户端做到这一点?
更新
考虑到这一点,我怀疑它是否可以纯粹在客户端完成。我想出了以下可能的方法:
所有流量都使用 SSL 连接
- 生成RSA 密钥,用AES 加密私钥(使用加盐密码)
- 在浏览器中生成盐
- 将密码短语 salt、公钥、加密私钥存储在服务器上
所有用户数据均使用其公钥加密,解密方法是让他们首先在浏览器中输入密码来解密其私钥,然后使用 RSA 私钥解密数据
如果用户希望与他人共享数据,请使用其他用户的公钥加密所述数据
我建议的方法安全吗?
将存储在服务器上的示例:
+----------+---------------------+---------------+
|Public Key|Encrypted Private Key|Passphrase Salt|
+----------+---------------------+---------------+
【问题讨论】:
-
问题是,如果客户端 JavaScript 源自服务器,那么客户端就不能完全信任服务器,如果它可以信任服务器,那么您通常不需要加密。如果没有 SSL/TLS,JavaScript 浏览器加密或多或少无用,请始终牢记这一点。
-
@owlstead 这个想法是为了防止未加密数据的服务器端泄漏。当然,服务器传递带有后门(或根本不使用加密)的网页总是存在风险,但是可以在客户端分析这种风险(至少在理论上:),但仍然是客户端加密增加了信任和安全性。
-
@EugeneMayevski'EldoSCorp 至于让以某种方式检索数据库的人无法读取数据,这个方案是可以的。任何有权访问应用程序服务器的人提供大量额外的保护措施是不行的。这包括攻击者和服务器的维护者。最后,如果公钥不能被信任,那么这个方案对于中间人攻击是不安全的,至少在没有 TLS 的情况下是不安全的。对你来说够具体了吗?
-
@owlstead 我应该提到,与服务器的所有通信都将通过 https
-
@MichaelRobinson OK,除了我之前做的cmets,这似乎是一个合理的方案。请注意,RSA 加密在 JavaScript 中非常慢。通常你会加密一个随机的 AES 数据密钥,而不是直接使用私钥。问题是您需要一个随机的 AES 密钥。为此,最好将在客户端收集的一些熵与来自服务器的随机字节混合起来,因为浏览器中的 JavaScript(默认情况下)也没有随机数据生成器。
标签: javascript security cryptography