5

使用主要现代浏览器之一的用户如何确定他正在运行我未经修改的 JavaScript 代码,即使是在不受信任的网络上?

以下是有关我的情况的更多信息:

我有一个处理私人信息的网络应用程序。登录过程是密码验证密钥协议的实现在 JavaScript 中。基本上在登录期间,客户端和服务器之间会建立一个共享密钥。一旦用户登录,所有与服务器的通信都会使用共享密钥进行加密。系统必须能够安全抵御 ACTIVE 中间人攻击。假设我的实现是正确的并且用户足够聪明,不会成为网络钓鱼攻击的受害者,那么系统中只剩下一个大漏洞:攻击者可以在下载我的应用程序时篡改它并注入窃取密码的代码。基本上整个系统依赖于用户可以信任在他的机器上运行的代码这一事实。我想要类似于签名小程序的东西,但如果可能的话,我更喜欢纯 JavaScript 解决方案。

4

3 回答 3

5

也许我误解了你的问题,但我的第一个想法是使用 SSL。它旨在确保您正在与您认为自己是的服务器交谈,并且没有人在中途修改内容。在这种情况下,您甚至不必信任网络,因为 SSL 的性质。

这种方法的好处是您可以相当轻松地将其放入现有的 Web 应用程序中。在大多数情况下,您基本上可以将您的 HTTP 服务器配置为使用 SSL,并将您的http://请求更改为https://.

于 2009-09-02T14:54:15.277 回答
4

这是一个古老的、悬而未决的问题,但答案似乎并没有做到这一点。

https:// 提供完整性而不是真实身份,也不是不可否认性

我引导你到http://www.matasano.com/articles/javascript-cryptography/

不要在 JS 中进行加密,因为恶意注入的脚本很容易获取密码或更改库。SJCL 很整洁,但它提供了一种公然错误的安全感(他们的引述,以及上面的引述)

不幸的是,这不如桌面应用程序那么好,因为完全防止代码注入、恶意服务器和侧信道攻击是不可行的。

长期的问题是 JavaScript 缺乏:

  1. 统一工作常量
  2. 使对象深度 const 且不可重新原型化的能力。
  3. 代码签名

    // codesign: cert:(hex fingerprint) signature:(hex MAC)

    证书的管理方式与 CA 证书类似。MAC 将与适当的签名/验证结构一起使用。

  4. 加密,剪贴板的东西是拥有 JavaScript 原生插件的原因(当然是签名的)

让 JavaScript 引擎全部实现标准是另一回事,但它是可行的,因为它绝对有必要结束大量恶意软件。

于 2013-07-28T04:34:02.177 回答
0

您可以拥有一个外部 Javascript 文件,该文件采用您的登录 JS 的 MD5 哈希,并向服务器发送 Ajax 请求以验证它是否正确且是最新的。在此处使用基本的安全或加密实践 - 公钥/私钥或其他方法来确保响应来自您的服务器。

然后,您可以自信地向用户显示客户端脚本已经过验证,并允许登录脚本继续进行。

于 2009-09-02T14:52:17.883 回答