Javascript 在用户之间安全地共享客户端加密数据

Javascript 在用户之间安全地共享客户端加密数据,javascript,security,cryptography,Javascript,Security,Cryptography,我正在制作一项服务,它将存储关于给定用户的个人数据,只有作者和目标用户才能查看这些数据。我希望在客户端执行加密,并只在服务器上存储生成的垃圾 互联网告诉我使用,这将为单一用户的数据工作得很好 问题 对于我的服务,其他用户可以输入只有他们和目标用户才能查看的数据-如何通过客户端加密实现这一点 是否可以纯粹在客户端执行此操作 更新 考虑到这一点,我怀疑它是否可以完全由客户端完成。我想出了以下可能的方法: 所有流量都使用SSL连接 生成一个密钥,用(使用salt密码短语)加密私钥 在浏览器中生成的

我正在制作一项服务,它将存储关于给定用户的个人数据,只有作者和目标用户才能查看这些数据。我希望在客户端执行加密,并只在服务器上存储生成的垃圾

互联网告诉我使用,这将为单一用户的数据工作得很好

问题 对于我的服务,其他用户可以输入只有他们和目标用户才能查看的数据-如何通过客户端加密实现这一点

是否可以纯粹在客户端执行此操作

更新 考虑到这一点,我怀疑它是否可以完全由客户端完成。我想出了以下可能的方法:

所有流量都使用SSL连接

  • 生成一个密钥,用(使用salt密码短语)加密私钥
    • 在浏览器中生成的盐
  • 在服务器上存储密码短语salt、公钥和加密私钥
  • 使用公钥加密的所有用户数据,首先让他们在浏览器中输入密码短语解密私钥,然后使用RSA私钥解密数据

  • 如果用户希望与另一用户共享数据,则使用另一用户的公钥加密所述数据

我建议的方法安全吗

服务器上存储的内容示例:

+----------+---------------------+---------------+
|Public Key|Encrypted Private Key|Passphrase Salt|
+----------+---------------------+---------------+

对您来说,处理OpenPGP会容易得多。OpenPGP使用公钥加密(RSA或Elgamal用于加密),因此该方案与您描述的类似,但无需重新发明轮子

OpenPGP实现适用于不同的语言,包括(尽管使用Javascript方式是不好的,因为存在各种可能导致信息泄露的安全弱点)。然而,由于同样的概念缺陷,用JavaScript实现的RSA方案也同样容易受到攻击


OpenPGP的一个好处是,用户要么已经熟悉OpenPGP,要么可以找到有关它的大量信息(这会增加对您的解决方案的信任),并且可以拥有自己的密钥。用户还可以使用任何OpenPGP工具生成密钥并打开加密数据

处理OpenPGP对您来说会容易得多。OpenPGP使用公钥加密(RSA或Elgamal用于加密),因此该方案与您描述的类似,但无需重新发明轮子

OpenPGP实现适用于不同的语言,包括(尽管使用Javascript方式是不好的,因为存在各种可能导致信息泄露的安全弱点)。然而,由于同样的概念缺陷,用JavaScript实现的RSA方案也同样容易受到攻击


OpenPGP的一个好处是,用户要么已经熟悉OpenPGP,要么可以找到有关它的大量信息(这会增加对您的解决方案的信任),并且可以拥有自己的密钥。用户还可以使用任何OpenPGP工具生成密钥并打开加密数据

问题是,如果客户端JavaScript源于服务器,那么客户端就不能完全信任服务器,如果客户端可以信任服务器,那么通常不需要加密。JavaScript浏览器加密在没有SSL/TLS的情况下或多或少是无用的,请始终记住这一点。@owlstead其思想是防止未加密数据的服务器端泄漏。当然,服务器交付的网页有后门(或根本不使用加密)的风险总是存在的,但这种风险可以在客户端进行分析(至少在理论上:),但是客户端加密仍然增加了信任和安全性。@EugeneMayevski'EldoSCorp至于让以某种方式检索数据库的人无法读取数据,这个方案是可以的。任何有权访问应用程序服务器的人都有很多额外的保护措施,这是不好的。这包括攻击者和服务器的维护者。最后,如果公钥不可信,那么该方案对于中间人攻击是不安全的,至少在没有TLS的情况下是不安全的。对你来说足够具体吗?@owlstead我应该提到,所有与服务器的通信都将通过https@MichaelRobinson好的,除了我之前的评论,这似乎是一个合理的方案。请注意,RSA加密在JavaScript中非常慢。通常,您将加密随机AES数据密钥,而不是直接使用私钥。问题是您需要一个随机的AES密钥。要做到这一点,最好将客户端收集的一些熵与服务器上的随机字节混合起来,因为浏览器中的JavaScript(默认情况下)也没有随机数据生成器。问题是,如果客户端JavaScript源自服务器,则客户端无法完全信任服务器,如果它可以信任服务器,那么通常不需要加密。JavaScript浏览器加密在没有SSL/TLS的情况下或多或少是无用的,请始终记住这一点。@owlstead其思想是防止未加密数据的服务器端泄漏。当然,服务器交付的网页有后门(或根本不使用加密)的风险总是存在的,但这种风险可以在客户端进行分析(至少在理论上:),但是客户端加密仍然增加了信任和安全性。@EugeneMayevski'EldoSCorp至于让以某种方式检索数据库的人无法读取数据,这个方案是可以的。任何有权访问应用程序服务器的人都有很多额外的保护措施,这是不好的。这包括攻击者和服务器的维护者。最后,如果公钥不可信,那么该方案对于中间人攻击是不安全的,至少在没有TLS的情况下是不安全的。对你来说足够具体吗?@owlstead我应该提到,所有与服务器的通信都将通过https@MichaelRobinson好的,除了