« beta技术沙龙的snmp话题的个人总结 | Main | 百度首席产品设计师孙云丰评论谷歌退出中国事件 »

使用php,js来对内容做rsa加密

作者:virushuo 发表于 2009-12-27 18:12 最后更新于 2009-12-27 21:12
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明



http://code.google.com/p/phpjsrsa/

这是一个用于文本加密的库,主要用于http协议下的防窃听。一般来说,如果应用https协议可以有效的避免窃听。但有几种情况必须考虑。

(1) 主机同时有https和http协议,部分用户通过https协议访问,获得了保护。但也有用户通过http访问,这部分用户会遭到窃听。除非关闭http请求,全面转向https。
(2) 主机并没有https支持。

很多情况下,我们需要保证主机安全,最好的办法是将其混入数字森林中。即:这台主机输出的内容没有人能看得懂的,只由无意义的代码和数字组成。用户浏览这台主机,不会触发任何关键词扫描。甚至该主机连https协议都不使用,更凸显其低调本色。

换言之,一个网站如果把自己的内容都变成字母和数字的组合,且不使用https协议,那么他就是数字森林中的一片树叶,丝毫不引人注意。

我们的目标应该是传输过程中不引人注意,并非绝对的不可破解的安全。

因此这个库的工作流程是:
1 php对"内容"做rsa加密->将加密结果输出到页面上。
2 用户浏览页面,html代码中的"内容"被加密成数字形态。私钥可以直接输出在页面代码中,也可由用户输入一次,保存在cookie中。使用cookie会降低密钥泄露的危险,更加有效。
3 通过javascript在用户浏览器上将这些数字解密为内容。
4 通过javascript dom来把内容写回到页面上。用户即可浏览。

利用javascript解密,可以把运算负担分散到客户端上。窃听者如要窃听每一个页面的内容,则必须要 1 获得密钥 2 用密钥解密内容

在已知密钥情况下,如客户端的每个页面运算负担为 1 ,页面数量n ,那么窃听者获得密钥之后的运算负担为 1*n。

为了运算效率,使用小质数作为rsa的p,q,理论上窃听者可以通过因数分解算出密钥,其运算负载为k,注意k 远远大于1。

如果每个站点使用不同的密钥,共计m个站点,窃听者的运算负担为 m*k+1*n,且负载集中。

而,如果采用双向可逆加密方法,在得知算法的情况下,窃听者运算负载极小。如果在通过变换算法来增加难度,又无法做到通用,给用户正常浏览造成困难。使用rsa方法,算法是标准的,用户使用成本很低,窃听成本很高。

在项目代码中,我已经实现了这一目标。但仍然有效率问题。

目前问题:

1 在没有bcmath和gnumath函数的php主机上,php加密内容的运算效率很低。和bcmath差距几十倍。好在大部分情况下,主机都是有bcmath函数的。这个问题不严重。
2 JS的bigint运算效率很低,主要是powmod的效率低,而这是rsa解密最频繁的操作。

希望有兴趣的朋友加入这个项目。效率问题解决后,还需要port在一系列常用软件上。比如dabr或twitese等。

另外,需要的质数可以在 http://www.prime-numbers.org 找。

我放了一个demo在: http://blog.devep.net/rsatest/test.php 可以看html代码,里面是没有中文内容的。

update: 使用了 http://www-cs-students.stanford.edu/~tjw/jsbn/ 的大数运算库,效率提高很多。

相关文章:

Comments

支持。有时间研究研究。

非对称加密!好!可以用在webproxy上~

Great Job!

还不太懂加密算法,不过作者提供的思路好像是为了让使用者拿来就用的。

这个加密不行~~~

@est 我没指望加密安全性,我只是希望用这个办法让窃听的时候压上去点运算量而已。

建议使用类似https的思路:
使用RSA传输一个key,然后用这个key进行对称加解密。这样做RSA解密的开销会小点儿

前一阶段,在架设php代理脚本时,我也考虑在浏览器端解密的可行性。由于时间问题搁置了。没有到博主已经做了这个工作,支持一个!

不能做成Proxy,能做成WordPress插件形式也好啊。

我不是很理解作者利用RSA的方式。

我觉得,最简单的方式是由用户端生成公钥发服务端。服务端用公钥加密内容,用户端用对应的私钥解密。

代价是服务端需要对每一个页面进行加密。但如果选择较小素数对这样的代价也相对小。而窃听者必须对私钥进行猜测,其代价巨大。

的确是个好主意,有时间研究研究

哇,这个帅啊,看看应用后是什么效果。

现在效率问题还很严重啊,FF3.5.6打开上面的DEMO要卡一下下

这样很可能会产生不好的用户体验,比如js加载不完全等...这样的流程本身也给客户端和服务器双方增加了额外的负担,不过想法到是不错的

嗯,大家都来发散思维,说不定新的传输加密方法就在贵国产生了

恭喜gf网成为(继se情业之后)最大的技术推动力

其实应该用非对称加密来加密对称密钥,然后用对称密钥来进行加密。由于对称加密算法的破解难度更高,速度更快,所以可以保证安全性。

至于实现proxy,实际上所有https的proxy都是带有非对称加密的,已经不是什么复杂的东西。从这个角度讲,只要主机使用https,它已然在数字森林之中了,并且他还有更强的功能。

我的办法是 私有keyset的base64
因为base64好实现 许多php proxy就是用这个的
其次 base64 是一次 取3字节转换成 4字节
可以流失处理 不需要扫描一遍字符串

具体的代码可见我的python版

http://jyf-code.googlecode.com/svn/trunk/python/b64s/b64.py

鉴于我们的目的只要是为了翻越墙,所以没有必要对全部内容进行RSA加密,可以采取折中的方式:类似于SSL的思路,只用RSA进行加密一个“密钥”,然后用“密钥”去加密和解密网页内容,后面这个加密解密动作可以简单点,比如直接与网页内容做一个“按位异或”即可。

如果只为了增加窃听的成本,可以不用RSA,使用其它方法可能更好,一些简单的变换就行了,js运行会很快的,还可以考虑用很多种不同的变换,服务器和客户机每次按照某种规律轮换使用,让窃听者找不出来其中的规律,

很高深的技术活儿啊!!!

有一个xxtea加密算法,似乎速度更快点

非常好的思路,用于防窃听,可以找找有没有更简单一点的加解密算法。

如果公钥和密钥都在不安全的http通信,那有何安全可言呢?你说的cookie显然也是不安全的。

如果只是增加窃听的成本也是不错的。只能尽量减少客户端的负担,并且服务端为了增加这个加密的成本也不能太多,比如可能有的php代码中返回了一段脚本,像你说的把加密的结果恢复出来加到dom中,但是返回的结果并不一定全部是html啊。也有脚本之类的东西,如果我返回的程序里有一个window.onload 脚本在页面初始化好之后执行特定的脚本,我看你给的demo是通过脚本来解密的,那我说的那个onload事件处理函数还能执行么? 这样的话现有程序就得做很大的改动来适应这种方法。

呵呵。当然我也只是刚好想到了这些。不过这个思路的确不错:)

关注此项目中;-)

貌似这个项目也是拿来测试浏览器JavaScript引擎性能之利器^^

我已将phpjsrsa添加到一个wordpress插件中,但愿作者不会介意…

期待2010会更好!

blog越来越技术化了~ 我等非技术牛人越来越读不懂了呢。:)

上面earthengine说的很好啊,另外对于有workerthread支持的浏览器,加密程度还可以提高,解密放在别的线程里做

我也同意私有keyset的base64。毕竟RSA计算太费时。

RSA没有必要,也没有安全性,只需要变换就可以了。
详细可见 http://larryli.zxq.net/

严重需要,之前打算对一个数据做类似处理,但时间有限,只好另找了一个简单的加密方法处理了,客户端js , eval加密了一下,勉强够用。现在博主提供的真是又帮我大忙呀

Post a comment


about me:
me.jpg
CC License. Some rights reserved.
署名·非商业用途·保持一致
本站之所有未作特别说明的内容均使用 创作共用协议.
POWERED_BY_MT_3.2