为什么需要TLS/SSL?

5
我知道每个人在网络上使用TLS / SSL作为传输层安全协议。
如果我手动生成密钥对,例如使用JS在客户端加密数据并使用http的GET / POST请求将该数据提交到我的服务器,那么有什么阻止我这样做呢?
我的意思是,我可以使用JS库使用公钥加密一些表单数据 - 对吗?
只有拥有私钥的人才能解密它 - 对吗?当然,私钥将保存在服务器上。没有密钥警告会弹出 - 因为传输是常规的http请求。那么我为什么需要TLS?

1
当已经有经过时间和广泛行业同行审查证明的方法在使用时,不要重新发明轮子。尝试制作自己的系统将是繁琐的,如果没有得到适当实施,可能会使您的系统面临攻击。这只是我的意见。=o) - cryptic ツ
@cryptic 虽然你的建议总体上是好的,但使用 JavaScript(假定它是通过未加密通道发送的)来加密/解密数据的特定情况不仅容易出现实现错误,而且甚至无法保证安全。 - CrazyCasta
5个回答

5

如何确保传递给浏览器的Javascript是将使用正确密钥进行加密的Javascript?

花一点时间思考,认识到安全最佳实践非常微妙和细腻,简单地在其上添加加密并不是解决方案。

此外,如果您处理“密钥弹出窗口”,则通过使用未签名的服务器证书破坏了TLS信任模型的一个方面(受信任的证书颁发机构)。


2
让我们举个例子说明这可能会出错的情况。假设您要加密的是一些表单数据并将其发送到服务器。服务器将其公钥发送给客户端进行加密。客户端使用JavaScript加密此数据并将其发送到服务器。假设发生了这种情况,那么您就没问题了。
现在让我们探讨一下这可能出错的情况。由于现在有状态转换等技术,很难在没有硬件访问权限的情况下嗅探他人的数据包。因此,在大多数情况下,您试图避免的情况也允许攻击者发起中间人攻击。在这种情况下,攻击者可以向客户端提供任何他们想要的JavaScript。窃取数据的秘密方式是提供执行与原始JavaScript相同的所有操作的JavaScript,并将未加密的数据发送到另一个服务器。
从服务器发送到客户端的数据也可能以类似的方式发生这种情况。
附:如果您的问题是缺少CA签名证书,我建议从http://www.startssl.com/获取免费证书。

啊,是的。有道理——JS文件仍然可以被恶意替换以进行加密。很有道理……而且现在执行加密的代码片段已经内置于浏览器中了,对吧? - Ryan Eckert
TLS/SSL 代码已经内置在浏览器中了。如果你遇到的问题是缺少证书,我建议在这里获得免费证书:http://www.startssl.com/(我也会将它添加到答案中)。 - CrazyCasta

2
你是正确的。你可以这样做,并且你会使用强加密,这实际上是SSL/TLS的一个基本组成部分之一。
其中一个问题是为每个数据计算它的计算成本很高。你还需要在客户端和服务器上拥有交叉兼容的库来处理加密/解密过程。
然而,你将失去Web应用程序的任何透明度,因为你现在必须对需要保密的每个数据执行此加密过程。
TLS是会话导向的,所以这不是一个苹果到苹果的比较。TLS正在设置一个透明的加密会话,客户端和服务器都不知道这个过程。它正在创建一个加密管道并允许数据通过它流动。它还内置了"信任"和身份的概念,以便客户端可以得到一些指示,他们发送的信息是否到达他们认为的人。
你所描述的是将数据片段加密,然后发送加密版本,并要求在使用之前进行解密。如果你想经历安装的痛苦,你的方案可以并且将起作用,但你获得了什么?此外,由于你的方案没有TLS中防止中间人攻击的任何内容,它容易受到这些问题的影响-从某人将自己的库和密钥注入到客户端,以便你的应用程序开始向他们发送数据而不是你,或者他们在你和客户端之间插入并向你发送数据,使你的服务器认为这些数据直接来自客户端,而实际上是来自攻击者。

1
数字证书包括主体的公钥,由CA使用其私钥进行数字签名。您的浏览器包含证书,用于识别其公钥(在根证书的情况下,使用相同的私钥进行签名),这使得您的浏览器可以验证您的身份,假设它信任预安装的CA证书。当您访问服务器时,服务器端证书用于将服务器的公钥传输到您的浏览器,然后您的浏览器使用该公钥加密初始凭据交换。当需要客户端证书时,类似的考虑使服务器能够识别您。
没有什么可以阻止您在JS库中使用您的公钥加密数据,但是服务器应该如何解密它呢?传递您的私钥会抵消私钥的目的,即确保只有您可以解密使用您的公钥加密的信息。因此,正确的处理方式是使用您的私钥进行加密,但是随后任何拥有您的公钥的人都可以解密它(通常使用此技术进行数字签名)。

实际上,您应该使用服务器的公钥来加密传输,并让它使用私钥进行解密。安全密钥交换的整个业务非常微妙,有许多例子(从IBM到下面)的公司和人们开发自己的加密系统,依赖于算法的隐私性。它们总是相对容易被破解。最好在您拥有更多安全经验之前不要设计自己的系统...


0

你的问题毫无意义。

如果你生成了一对密钥并使用公钥加密,那么只有你才能解密该消息。因此将其发送给其他人是徒劳的。你可以使用服务器的公钥进行加密,但这样你就面临着确切地安全建立服务器公钥的问题。

而且服务器没有办法将数据加密回传给你,除非它使用你的公钥,这样它就面临着与你作为客户端时已经遇到的身份验证问题相同的问题。

TLS/SSL解决了这些问题,以及你还没有想到的一些其他问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接