使用主要现代浏览器之一的用户如何确定即使在不受信任的网络上也运行未经修改的javascript代码?
以下是有关我的情况的更多信息:
我有一个处理私人信息的网络应用程序。 登录过程是JavaScript中password-authenticated key agreement的实现。基本上在登录期间,在客户端和服务器之间建立共享密钥。用户登录后,使用共享密钥对与服务器的所有通信进行加密。系统必须能够安全地抵御主动中间人攻击。 假设我的实现是正确的并且用户足够聪明而不会成为网络钓鱼攻击的受害者,那么系统中只剩下一个大漏洞:攻击者可以在下载时篡改我的应用程序并注入窃取密码的代码。基本上整个系统依赖于用户可以信任其机器上运行的代码的事实。 我想要一些类似于签名applet的东西,但如果可能的话,我更喜欢纯粹的javascript解决方案。
答案 0 :(得分:4)
也许我误解了你的问题,但我的第一个想法是使用SSL 。它旨在确保您与您认为自己的服务器通话,并且没有人在中途修改内容。在这种情况下,由于SSL的性质,您甚至不必信任网络。
这种方法的好处在于您可以相当轻松地将其放入现有的Web应用程序中。在大多数情况下,您基本上可以将HTTP服务器配置为使用SSL,并将http://
请求更改为https://
。
答案 1 :(得分:4)
这是一个古老而开放的问题,但答案似乎没有做到这一点。
https://提供完整性,不是真正的身份识别或不可否认性。
我将你引导至http://www.matasano.com/articles/javascript-cryptography/
不要在JS中执行加密操作,因为恶意注入的脚本可以轻松获取密码或更改库。 SJCL很整洁,但它提供了一种明显错误的安全感(他们的引用,并在上面引用)
不幸的是,这不如桌面应用程序那么好 因为完全防止代码是不可行的 注入,恶意服务器和旁道攻击。
长期问题是JavaScript缺乏:
代码签名
// codesign: cert:(hex fingerprint) signature:(hex MAC)
Certs的管理方式与CA证书类似。 MAC将与适当的签名/验证结构一起使用。
加密,剪贴板的东西是拥有JavaScript原生插件的理由(当然是签名的)
让JavaScript引擎全部实现标准是另一回事,但它是可行的,它绝对有必要结束大量的恶意软件。
答案 2 :(得分:0)
您可以拥有一个外部Javascript文件,该文件采用您的登录JS的MD5哈希值,并向服务器发送Ajax请求以验证它是否正确且是最新的。在此处使用基本安全或加密实践 - 公钥/私钥或其他一些方法,以确保响应来自您的服务器。
然后,您可以放心地向用户显示已验证客户端脚本,并允许登录脚本继续。