web表单安全加密的实现(基于RSA的一次一密)

  • Post author:
  • Post category:其他




最近在做一个web网站,其中需要用到用户登录注册的功能,作为一个对安全问题要求苛刻的coder,我在着手开始之前想到了很多需要解决的问题。



首先是用户名、密码提交到后台的时候,有两种方式,GET和POST,GET方法参数传递的时候是直接附在网页url之后的,很容易就可以看到表单信息,所以首先淘汰了这种方法。相比之下POST方法向后台提交数据的方法相对比较安全,表单信息是附在http请求头中,一般比较难看到,但是并不是不能截获,比如用chrome的开发工具很容易就能看到formdata,还有像Windows下的fiddler的专业嗅探工具等。还有一种方法,就是通过https的方式进行表单提交,但是这种方式条件要求较高,比如需要申请证书,服务器架设,以及性能问题等,对小网站开发来说有点杀猪用牛刀的感觉了。



所以我想到的是通过js对表单进行加密,然后在传到后台验证。加密的方式可以有很多种,比如简单的异或操作,或者MD5等对称加密的方法,还有一种是非对策加密,目前最流行的应该是RSA加密。首先要说的是静态的加密,比如MD5,异或操作等,这种方法每次加密后的结果都是相同的结果,所以只要别有用心的人截获到加密后的消息,以后直接模拟表单提交该信息就可以验证通过,显然是不可取的。就算RSA加密也是如此,除非每次加密使用的公钥都会不一样,也就是本文所要讨论的一次一密的方式,但是每次表单验证都动态生成密钥的方法不可取,因为生成一个1024bit的密钥需要3秒左右的时间,这是不能忍受的。



所以到底要怎么样才能实现安全又高效的加密呢?我这里提供了一种比较简单但是可行的方法,就是上面说的方法的改进。



好了,实现方式正式开始:



首先加密的思路是服务器只生成一次rsa密钥,每次用户登录之前服务器会随机生成一个长度为4的整型数组(这里模仿了下websocket的加密方式),用来与用户密码进行异或,异或的结果再经过rsa加密,这样每次生成的信息都会不一致,而且无法解密信息,就能大大避免网站用户信息泄漏了。



首先服务器先用openssl生成RSA密钥,我这里是生成1024bit的密钥。安装openssl之后运行命令:

openssl genrsa -out priv.key 1024

就生成了一个长度为1024的密钥,并且保存到当前目录priv.key文件,默认的Exponent参数是0x10001。然后生成供js加密的modulus并保存到modulus文件中:


openssl rsa -in priv.key -noout -modulus >> modulus

当浏览器载入登录界面时,首先客户端请求服务器相关密钥信息,服务器取得加密所需公钥,以及随机生成一个长度为4的整型数组并且保存到session中以供验证使用,然后返回给客户端,客户端接受输入之后加密信息并传到后台就可以了。这里附上相关代码,服务器端是PHP实现的,用了CI框架。

首先在使用rsa加密前要引入开发包,需要几个js文件如下:

*jsbn.js-basic BigInteger implementation, just enough for RSA encryption and not much more.

*rsa.js – implementation of RSA encryption, does not require jsbn2.js.

*rng.js

*prng4.js

这些文件可以到这个网站找到:http://www-cs-s



版权声明:本文为xidomlove原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。