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

本文探讨了在Web表单安全中如何实现加密,以防止用户名和密码在传输过程中被截获。作者分析了GET和POST方法的安全性,以及HTTPS的适用场景。提出了一种改进的加密方案:结合RSA非对称加密和服务器随机生成的异或密钥,确保每次加密后的信息不同,从而提高安全性。同时,提供了PHP实现的服务器端代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做一个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-students.stanford.edu/~tjw/jsbn/

然后是服务器端代码:

<?php if ( ! define
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值