【问题标题】:why is TLS/SSL necessary? [closed]为什么需要 TLS/SSL? [关闭]
【发布时间】:2012-12-03 01:24:55
【问题描述】:

我知道每个人都使用 TLS/SSL 作为网络上的传输层安全性。

什么会阻止我手动生成假设密钥对,使用该公钥加密数据客户端(例如使用 JS)并使用 http 的 GET/POST 请求将该数据提交到我的服务器?

我的意思是——我可以使用 JS 库用那个公钥加密一些表单数据——对吧?

只有拥有私钥的人才能解密它——对吧?当然,私钥会保存在服务器上。不会弹出任何关键警告 - 因为传输是常规的 http 请求。那么为什么我需要 TLS?

【问题讨论】:

  • 当已经使用的方法已经通过时间和广泛的行业同行评审证明了它们时,不要重新发明轮子。尝试制作自己的系统将是乏味的,如果实施不当,实际上可能会使您的系统受到攻击。只是我的观点。 =o)
  • @cryptic 虽然您的建议总体上很好,但使用 JavaScript(可能是通过未加密的通道发送)加密/解密数据的特定情况不仅容易受到实现错误的影响,而且不是甚至是安全的。

标签: php openssl ssl


【解决方案1】:

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

想一想,并意识到安全最佳实践非常微妙和微妙,简单地在上面加上加密并不是解决方案。

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

【讨论】:

    【解决方案2】:

    让我们举一个例子来说明这会如何出错。假设您要加密的是一些表单数据并将其发送到服务器。服务器将其公钥发送给客户端进行加密。 JavaScript 中的客户端加密此数据并将其发送到服务器。假设这就是发生的事情,你会没事的。

    现在让我们来探讨一下这会如何出错。如今,在切换状态等情况下,很难在不访问硬件的情况下嗅探别人的数据包。因此,您试图避免的大多数情况也允许攻击者在中间攻击中出现一个人。在这种情况下,攻击者可以向客户端提供他们喜欢的任何 JavaScript。窃取数据的一种秘密方法是提供 JavaScript 来完成原始 JavaScript 所做的一切,并将未加密的数据发送到另一台服务器。

    对于从服务器发送到客户端的数据,这可能会以类似的方式发生。

    附:如果您的问题是缺少 CA 签名证书,我建议您从 http://www.startssl.com/ 获得免费证书

    【讨论】:

    • 啊。是的。有道理——加密的 JS 文件仍然可以替代恶意文件。有道理...现在进行加密的代码已内置在浏览器中-对吗?
    • TLS/SSL 代码是内置在浏览器中的,是的。如果您的问题是缺少证书,我建议您在这里免费获得一个:startssl.com(我也会将其添加到答案中)。
    【解决方案3】:

    你是对的。您可以这样做,并且您将使用强大的加密技术,这实际上是 SSL/TLS 的底层组件之一。

    其中一个问题是,为每条数据计算它的计算成本很高。您还需要在处理加密/解密过程的客户端和服务器上具有交叉兼容的库。

    但是,您的网络应用程序将失去任何透明度,因为您现在必须对需要保密的每条数据执行此加密过程。

    TLS 是面向会话的,所以这不是苹果对苹果的比较。 TLS 所做的是设置对客户端和服务器透明的加密会话。它正在制作一个加密管道并允许数据流过它。它还包含“信任”和身份的概念,因此客户可以有一些迹象表明他们正在发送的信息将发送给他们认为的人。

    您所描述的是获取数据片段,对其进行加密,然后发送加密版本,并在使用前要求另一方解密。如果您想经历设置的痛苦,您的计划可以并且将会起作用,但是您获得了什么?此外,由于您的方案将没有 TLS 在防止中间人攻击方面所具有的任何东西,因此它在很多方面都容易受到这些问题的影响——有人将他们自己的库和密钥注入客户端以便您的应用程序启动向他们而不是您发送数据,或者他们在您和客户端之间传输数据,并向您发送您的服务器认为直接来自他们而不是来自攻击者的数据。

    【讨论】:

      【解决方案4】:

      数字证书包括主题的公钥,由 CA 使用其私钥进行数字签名。您的浏览器包含标识其公钥的证书(在根证书的情况下使用相同的私钥签名),这允许您的浏览器(假设它信任预安装的 CA 证书)验证您的身份。当您访问服务器时,服务器端证书用于将服务器的公钥传输到您的浏览器,然后浏览器使用它来加密凭据的初始交换。当需要客户端证书时,类似的考虑允许服务器识别您。

      没有什么可以阻止你在 JS 库中使用你的公钥来加密数据,但是服务器应该如何解密它呢?将您的私钥传递给它会否定私钥的目的,即确保只有您可以解密使用您的公钥加密的信息。所以正确的做法是用你的私钥加密,但是任何拥有你公钥的人都可以解密它(这种技术通常用于数字签名)。

      真的,你应该使用服务器的公钥来加密你的传输,并让它使用它的私钥来解密它。整个安全密钥交换业务非常微妙,有很多公司和个人开发自己的加密系统的例子(从 IBM 往下),依靠算法的隐私。事实证明,它们相对容易破解。在您有更多安全经验之前,最好不要设计自己的系统...

      【讨论】:

        【解决方案5】:

        你的问题没有意义。

        如果您生成密钥对并使用公钥加密,则只有您可以解密该消息。所以把它送给别人是徒劳的。您可以使用服务器的公钥进行加密,但是您遇到了安全地确定确切内容的问题。

        然后服务器无法将数据加密回给您,除非它使用您的公钥,在这种情况下,它会遇到与您作为客户端已经拥有的身份相同的问题。

        TLS/SSL 解决了这些问题,以及您尚未想到的其他一些问题。

        【讨论】:

          猜你喜欢
          • 2012-08-26
          • 2023-04-02
          • 1970-01-01
          • 2017-04-27
          • 2018-03-22
          • 2021-11-06
          • 1970-01-01
          • 2019-03-26
          • 1970-01-01
          相关资源
          最近更新 更多