【问题标题】:How to use asymmetrical encryption to receive data in javascript?如何使用非对称加密在 javascript 中接收数据?
【发布时间】:2016-04-19 03:35:56
【问题描述】:

我理解非对称加密的概念,因为客户端希望将数据安全发送到服务器。服务器向客户端发送用于加密数据的公钥。服务器使用它的私钥解密消息。在这种情况下,一切都有意义,因为私钥只能由服务器访问。

但是如果客户端想要安全地接收数据怎么办?相同的概念可以应用于相反的方向(前端共享公钥并拥有私钥),除了私钥对任何人都可用,因为 javascript 中的源代码在 Web 浏览器中可用,它会失败加密的目的……

当然有解决方案。在搜索时,尽管很多人提到了 HTTPS,但我还没有找到我的问题的明确答案。我也想知道它为什么以及如何工作,以及我的知识在哪里存在缺陷。

客户端如何安全地从服务器接收数据?

【问题讨论】:

    标签: javascript encryption frontend public-key-encryption encryption-asymmetric


    【解决方案1】:

    正如您已经提到的,HTTPS 是这里的解决方案。您已经介绍了它的工作原理,但您只是缺少一些关键细节。

    HTTPS 使用非对称加密来建立初始加密通信。后续通信实际上是使用对称加密来执行的,因为它对于较小的密钥大小来说性能更高、更安全。因此,最初的握手使用服务器的公钥来交换一个共享的密钥,然后服务器和客户端都将使用该密钥进行所有通信。

    此外,服务器使用的公钥通常由受信任的证书颁发机构签名,您的浏览器已经知道该证书颁发机构的密钥。这允许您的 Web 浏览器验证服务器的公钥,以便您知道通信没有被位于您和服务器之间的攻击者拦截和更改。否则攻击者可能只是拦截所有通信并向您发送一个声称是服务器公钥的不同公钥,您怎么知道其中的区别?

    一旦建立了加密通道,客户端发送给服务器的任何内容都会被加密,同样,服务器发送给客户端的任何内容都会被加密。这里的加密保证确保所有通信的机密性和完整性。

    因此,通过使用 HTTPS,客户端可以安全地从服务器接收数据,也可以安全地向服务器发送数据,而无需将任何密钥直接嵌入到 Javascript 代码中。

    【讨论】:

    • 太棒了,但我很难理解这部分:“所以最初的握手使用服务器的公钥来交换服务器和客户端将用于所有人的共享密钥沟通。”。浏览器用公钥加密了什么?它是否对自己生成的某种密码进行加密,成为后续通信的“对称密钥”?
    • @maximedupre 基本上,是的。浏览器发送一个加密的秘密(使用服务器的公钥加密),用于生成用于对称加密的密钥。所以服务器和客户端都有这个共享的秘密。详情见:en.wikipedia.org/wiki/Transport_Layer_Security#TLS_handshake
    • @maximedupre 您可能还对Diffie–Hellman key exchange 感兴趣,这是一种更有效的机制,可以在没有预先存在的非对称密钥的情况下通过公共通道建立共享秘密。我的理解是HTTPS有时会用到这个,但我不是很清楚。
    【解决方案2】:

    SSL 只是另一层安全性(至少对some extent 而言)。任何CA本质上是安全的。您可能希望将 PKI 与常见的对称算法一起使用,例如 this(示例用法),其中(取决于数据大小 - PKI 用于加密小数据块)公钥加密初步生成的对称密钥(加密一些数据)在发送方和接收方的私钥解密对称密钥(反过来解密数据)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 2012-12-25
      相关资源
      最近更新 更多