如何使用非对称加密接收javascript中的数据?

How to use asymmetrical encryption to receive data in javascript?

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

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

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

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

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

HTTPS 使用非对称加密来建立初始加密通信。后续通信实际上是使用对称加密执行的,因为它对于更小的密钥大小而言性能更高且更安全。因此,初始握手使用服务器的 public 密钥来交换服务器和客户端随后将用于所有通信的共享密钥。

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

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

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

SSL 只是另一层安全(至少 some extent). Any CA is not inherently secure. You may want to use PKI along with the usual symmetric algorithms like this(示例用法),其中(取决于数据大小 - PKI 用于加密小数据块)public 密钥在发送方加密初步生成的对称密钥(加密一些数据),在接收方用私钥解密对称密钥(它又解密数据)。