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

最近在做一个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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值