Javascript可用于抵御SSL / TLS漏洞吗?

时间:2012-01-09 22:07:17

标签: javascript ssl

令我非常恐怖的是,我最近发现我之前认为SSL / TLS协议是确保用户完整性的安全选择,实际上存在多个漏洞,并且有可用漏洞(CAs in 2009renegotiation exploit in 2009BEAST in 2011)。因此,似乎存在其他一些小漏洞。

所以最重要的问题仍然是,该怎么办?据我所知,我上面链接的最后两个漏洞需要大量先前已知的信息,然后进行一些猜测(BEAST)或者只能部分利用我的“安全”连接,因为它实际上无法解密发送的数据(重新协商) 。然而,这些方法看起来仍然非常非常具有威胁性,我怀疑黑客将这些漏洞加入其武器库之前还有很长时间。

作为一个明显的对策,我想到使用Javascript添加额外的加密层到我负责的webapps的额外敏感部分。我知道有一些好的加密库正在出现,所以加密本身不是问题。然而,问题是我还阅读了this fine article about Javascript as a cryptographic security measure,并且对该方法的批评让我想知道使用Javascript的额外安全性是否可行/合理。

问题是,我认为也许Javascript加密无论如何可以使事情更安全,因为至少我连接的最后两个是中间人攻击,所以也许是额外的加密会破坏他们的攻击(而且我根本不知道 SSL / TLS协议)。

您认为使用Javascript(对安全的受控环境)添加额外加密会消除这些威胁吗?

修改

我认为到目前为止的3个答案已经误解了我一点。我非常清楚完全违反SSL / TLS连接会使任何进一步的Javascript加密无效(正如您所指出的那样 - Javascript本身会受到损害并且可能会被更改)。 然而,我提到的任何漏洞都没有 - 正如我所理解的那样 - 允许攻击者立即完全破坏连接,尤其不是重新协商攻击。问题更多的是,是否有人了解SSL / TLS以及Javascript的加密困难是否可以解释Javascript加密是否可以抵御这两个特定漏洞的问题?

尽管如此,我得出的结论是它不会增加安全性。如果有的话,因为我已经怀疑Javascript本身是一种能够正确地进行加密的语言(在阅读a little more about cryptography best practices之后),主要是因为它缺乏安全的随机数生成器。然后在答案中写下的所有其他正当理由将最后的诀窍放在那个的想法中。

3 个答案:

答案 0 :(得分:1)

我怀疑JS加密比SSL / TLS更好,即使有上述漏洞也是如此。如果你足够好/有足够的动力打破SSL,那么一些JS加密将不会成为一个问题 - 特别是在众多问题上。适当的随机数和确保正确的交付是主要的。

另一方面,添加更多加密可能相当简单,可能会让您感觉更好。

我会仔细考虑您的用户面临的风险,然后努力减轻这些风险(尽管我相信您已经有了)。

答案 1 :(得分:1)

你应该把批评JavaScript加密的文章认真对待。 JavaScript不会使您的应用程序更安全。它不会使提到的漏洞无用。

如果攻击者能够通过SSL / TLS操纵连接,他还可以操作JavaScript源文件。

在一个真实世界的例子中 - 您使用JavaScript在客户端散列用户密码,因此它们不会作为明文发送到线上(人们实际上这样做) - 攻击者可以通过{{替换sha1方法1}}然后在他正在嗅探的连接上读取密码。

关于这个主题:您必须了解don't roll your own crypto。不要下载用JavaScript实现的随机加密算法并将其用于某些事情 - 它不会是安全的,因为你不知道自己在做什么。

我希望我的例子是可以理解的。它也应该适用于更复杂的场景(如公钥加密等)。

修改 - 对您的修改的回复:

是否需要额外的JavaScript加密层来修复这些错误很难搞清楚。

但我的观点是,如果你使用那个JavaScript AES库,你会发明自己的加密协议 - 这很糟糕。另见布鲁诺的回答;这真的不是你可以解决或担心的事情。即使你可以,你在JavaScript中使用它的方法可能在某些时候仍然失败(正如你自己想的那样)。

答案 2 :(得分:1)

在考虑使用JavaScript添加额外的加密层之前,因为据称SSL / TLS已被破坏,您应该真正理解您提到的有关SSL / TLS的问题。一般出版社发布的信息(您发布的链接)可能是简化,误导或耸人听闻的。

证书问题

这不是SSL / TLS本身的漏洞,当然这很重要。无论您设计的新系统是什么,都必须依靠基础设施来识别远程方。这是一些模型(基于公钥加密),主要是PKI(la X.509,见RFC 5280)和Web-of-Trust(la PGP)。

这些问题属于子类别:

  • 未正确检查已颁发证书的主机名(例如,\0将传递给另一个主机):这是一个实现错误。令人遗憾的是,错误是定期实现的,有时候确实是与安全相关的代码。 SSL / TLS的设计不应该归咎于此。主机名验证的实现是。 (有关HTTPS或RFC 2818 section 3.1,请参阅RFC 6125。)这可以通过修复库/浏览器中的错误并升级到固定版本来解决。如果没有正确实施规范,将偶尔使用任何协议(SSL / TLS)进行。 (当然,使用X.509证书的ASN.1结构的"清晰度"并没有帮助...)
  • 主机名可能无法在浏览器中清晰显示。 GUI是一个可以改进的领域,但似乎也难以相应地教育用户。例如,已尝试推动使用扩展验证证书(绿色条),但这也可能造成一些额外的混淆(并非没有那些从EV证书中获益最多的人那些聪明的营销)。
  • CA有时会在颁发证书时出错(或被盗用)。也许那些CA证书不应该首先出现在您的浏览器中。

问题不仅仅是技术问题。它更多的是关于如何作为一个人,你可以检查你是否想要信任放在你面前的信息(即你是否相信证书是真的并且是你想要与之交谈的服务器的证书)。

我认为这个问题没有一个完美的解决方案。信任是很难建模的。这种情况可能发生在任何情况下,不一定与SSL / TLS或互联网相关。 (你看过多少朋友和他们的护照来检查他们的名字?他们都是真的吗?你确定吗? 在当局获得一些虚假信息之后,他们还没有被发出?)

实现可能并不完美,浏览器开发人员可以修复错误并改进GUI。但是,我不认为任何JavaScript插件都可以解决这个问题:您仍需要类似的方法来识别远程方。有一些浏览器插件可以部分帮助(例如通过与证书的其他缓存副本进行比较),但最终,用户有责任选择是否信任服务器的身份

(另一个缺点是,一些开发人员似乎并不想过多地了解该领域:请参阅SO上的问题数量,询问如何禁用证书验证,以消除警告信息。如果人们不想看到警告信息,这也是一个人为问题。)

重新协商利用(CVE-2009-3555)和BEAST

重新协商漏洞确实是一个协议错误,但这已在RFC 5746中得到修复。 (当时有人认为它不是纯粹的SSL / TLS错误,但它也是SSL / TLS如何与它所保护的应用程序协议交互的问题。它可能是一个问题如果HTTP堆栈能够被通知SSL / TLS重新协商,则已经避免了,但这是一个灰色区域,并且HTTP服务器实际上并没有真正为此设计:太晚和/或太大的任务。 )有关修复的问题与部署有关。同时升级每个人都很困难。鼓励人们升级到更新版本的TLS(实际上是沟渠SSL)会有所帮助。

BEAST是一个问题(非常特定于浏览器),但这可以通过更好地配置SSL / TLS堆栈或再次升级到更新版本的SSL / TLS来解决。

在这里,SSL / TLS似乎是版本升级时停滞不前的受害者。这当然比其他软件更有问题,因为远程方(可能是您从未见过的在线客户)通常也必须升级他们的SSL / TLS版本。 我会说,虽然重要的(通常用于商业目的)不排除许多无法或不会更新其浏览器/操作系统的用户,但服务器需要的是无论如何升级。 同样,遗憾的是,这并非特定于SSL / TLS。任何需要支持IE6的Web开发都会遇到类似的问题(以及it should be killed off...)。

同样,我非常怀疑基于JavaScript的解决方案是否会遇到类似的问题(特别是浏览器兼容性和版本问题)。