加密:在JavaScript和Python中模拟SSL
因为中国的防火墙屏蔽了谷歌应用引擎的HTTPS端口,所以我想用JavaScript和Python模拟一个安全套接字层(SSL),以保护用户的信息不被互联网服务提供商(ISP)和防火墙捕获。
我的计划:
- 握手过程:
浏览器向服务器发出请求,服务器生成一个加密密钥k1和一个解密密钥k2,然后把k1发送给浏览器。浏览器生成一个加密密钥k3和一个解密密钥k4,然后把k3发送给服务器。
- 浏览过程:
在会话期间,浏览器用k1加密数据并发送给服务器,服务器用k2解密。服务器用k3加密数据并回复给浏览器,浏览器用k4解密。
请帮我找出我的错误。
如果这个过程是正确的,我的问题是:
- 如何在JavaScript和Python中生成一对密钥,有没有一些库可以使用?
- 如何在JavaScript和Python中加密和解密数据,有没有一些库可以使用?
4 个回答
这里其他的回答都是对的:你无法安全地传送将在客户端运行的JavaScript代码。不过,如果你还是想深入了解这些内容,可以看看一个开源项目叫做Forge。它在JavaScript中实现了SSL/TLS,并且有一个简单的Python SSL服务器:
http://github.com/digitalbazaar/forge/blob/master/README
如果你想了解更多关于它的用途,可以阅读以下链接:
你无法阻止中间人截获你的数据包或消息,特别是当他们根本不在乎你是否发现的时候。你能做的就是对你的消息进行加密,这样即使他们截获了,也无法读取你发送和接收的内容。从理论上讲,这样做是没问题的,但实际上,即使有了密钥,你也无法手动完成现代加密的工作:你还需要传输一些软件,这就变得更加麻烦了。
你希望在客户端本地拥有加密软件,或者至少要有足够的工具来检查加密软件的数字签名是否正确。数字签名是非常难以伪造的。你可以传送经过签名的代码,检查它的签名,如果签名能通过你信任的公钥验证(可惜的是,你需要另外传输这个公钥),那么你就知道这个代码(以及随附的任何CA证书——信任根)是可以信任的。这样,数据包就可以通过普通的HTTP发送;它们要么能到达目的地,要么被截获,但无论如何,除了预定的接收者,其他人都无法读取这些内容。SSL的唯一好处就是它几乎为你构建了所有这些东西,并且让事情变得简单。
我不知道在Javascript中实现这一切的实际可行性。显然它是可以做到的——因为它是一个图灵完备的语言,能够访问所有必要的系统调用——但这样做可能会非常昂贵。也许考虑使用GPG会更简单一些……
(向政府隐瞒你正在进行通信的事实是一个完全不同的问题。)
你遇到了一个根本性的问题,就是如果用JavaScript来实现SSL,它没有内置的根证书来建立信任关系,这样就无法防止中间人攻击。你从自己的网站发出的任何证书,包括根证书,都可能被间谍截获并替换。
需要注意的是,这并不是SSL工作方式的特殊情况,而是一个基本的限制。所有的加密安全都依赖于建立一个共享的秘密。主流浏览器中使用的根证书提供了一个信任网络的入口,这个网络是由认证机构(CAs)建立的,能够让你和一个已知的第三方建立共享秘密。根据我所知,这些证书并不能直接被JavaScript代码访问。它们只是用来建立安全的连接(比如https)。