假设我的页面没有 SSL。我们假设有以下步骤:
用户向我的网页发出请求(我们称之为 www.mypage.com)。
客户端 JS 创建一个SYMMETRIC KEY。
客户端 JS 向我的后端页面发出请求,请求我的服务器的PUBLIC KEY 。
客户端 JS 对获得的PUBLIC KEY中之前生成的SYMMETRIC KEY进行加密。
客户端 JS 将加密数据发送到服务器。
服务器对接收到的数据进行解密。
服务器开始发送/读取在步骤 2 中生成的对称密钥中加密的所有后续信息。
客户端 JS 也开始发送/读取在步骤 2 中生成的对称密钥中加密的所有后续信息。
据我所知,即使攻击者监听了步骤1到步骤8的每一条信息,他们也无法解密任何内容,用户是安全的。
你们同意我的观点吗?我对么?如果是,我们是否可以假设浏览器中的本机 SSL 存在是因为“写得不好”的页面?
TLS 旨在保护客户端和服务器之间的通信免受中间人攻击者拦截和修改通信的影响。这可能是 ISP,也可能是公共 WiFi 热点的所有者,也可能是您的 LAN 或 WiFi 热点中的攻击者,该攻击者使用 ARP 或 DNS 欺骗重定向您的流量。让我们看看这个建议的方法在这种情况下是如何工作的。
这个客户端 JS 首先来自哪里?希望不是来自服务器,因为不能保证攻击者没有修改它。但假设这是通过某种安全连接传输到客户端的......
由于对服务器的此请求未受到拦截和修改的保护,中间人攻击者可以简单地用自己的公钥替换公钥并将其发送到客户端。由于客户端没有对公钥进行任何验证(即没有对服务器进行身份验证),因此它将接受它。
从那时起,客户端将相信与服务器交换对称密钥和加密流量,而实际上是与攻击者交换。攻击者可以解密对称密钥和流量,并以此建立自己与服务器的连接,这次使用来自服务器的原始密钥。
总之:您缺少 TLS 的一个关键点 - 服务器身份验证。这使得中间的主动人很容易突破保护。
请注意,您的方法存在更多缺陷,例如没有前向透明度、没有消息完整性、没有重放保护。但缺少服务器身份验证是最明显也是最关键的问题。
它内置于浏览器中,因为加密很容易出错,因此不要依赖用户自己进行加密。它随根 CA 作为信任锚一起提供,因为使用先前未知的远程方进行加密需要某种方式来验证该方实际上是预期的一方(您缺少的服务器身份验证),这是通过检查 TLS 中的服务器证书来完成的针对内置的受信任根 CA。
另请参阅为什么我们不应该自己推出?为什么你不应该尝试发明自己的加密协议而应该依赖既定的标准。