在不使用 SSL/TLS 的情况下交换数据的方法有哪些

What are some approaches to exchange data without using SSL/TLS

创建任何类型的应用程序网站时,api 等;如今,最佳实践建议使用 TLS 来保护端点,但我们可以从 cloudbleed 问题中了解到,这可能还不够。

因此,我想知道即使在 TLS 遭到破坏的情况下,可以采取什么措施来保持一定程度的安全性。

对于 Web 应用程序,我目前使用的是 jsencrypt,基本上在发送之前在客户端浏览器端加密所有数据,但为此我需要先交换一个共享密钥(token/cookie) 在服务器和客户端之间,但是在处理不支持 javascript 的 API 时,可以使用什么?

关于令牌的交换,凭直觉说使用 OAUTH 可能是显而易见的,OpenID Connect, json tokens,但所有这些都需要或委托信任 TLS,当它被破坏时它又变得毫无用处。

如果我是对的,OpenID 可以在没有 SSL 的情况下通过 Diffie–Hellman key exchange, is there something similar that could be implemented keeping in mind that if TLS gets compromised, easy measure could be taking like revoking tokens or changing "salts" ?

共享 "common secret"

目前我认为遵循 gpg 或 rsa (private/public) 密钥是可行的方法,这样可能每个人都可以访问 public 密钥但不会可以查看为特定用户签名的某些数据的内容。

但问题仍然在于如何首先 "known secret" 在客户端和服务器之间交换,避免可能 man in the middle attack 考虑到 TLS 不可信任。

交换第一个 "known secret" 的问题对于所有协议都是一样的,无论是否使用 SSL。 SSL 是一个 public 密钥基础设施,其中需要分发的基本信息是证书颁发者的根证书的 public 密钥。所有 ssl 证书颁发者的 public 密钥随浏览器安装一起分发。

任何协议都将依赖于服务器和客户端之间在与建立通信的通道不同的通道中通信的某些信息。如果您不信任 SSL 基础设施,您将不得不通过电子邮件、邮政信件、短信或其他方式发送此信息。

但是,您的问题并非始于您在 Web 应用程序中使用的加密库所需的密钥。您的 Web 应用程序(javascript 文件)也通过 SSL 从服务器发送到 Web 浏览器。如果您的 SSL 通信被中间人破坏,这个中间人也可能能够更改您发送到浏览器的网页和 javascript 代码。他可以重写您的应用程序并删除所有加密代码、为用户添加新字段和消息、将用户发送到其他站点等等。

SSL 基础设施确实是网络安全的基石,也是网络应用程序的必需品。没有它,您将不得不构建一个用于发送加密网页的自定义协议,并编写一个能够理解该协议的自定义浏览器。

综上所述,当然可以在 SSL 之上添加一小层额外的安全保护。例如,您可以为每个用户创建一个 private/public 密钥对,向用户发送一个 public 密钥,并使用私钥加密从您的服务器发送给用户的所有消息。这可以防止中间人能够监听通信但无法更改您的消息的情况。