首页
社区
课程
招聘
[转帖]Python + js 通过RSA算法对post表单数据进行加密处理
发表于: 2017-11-30 11:08 2562

[转帖]Python + js 通过RSA算法对post表单数据进行加密处理

2017-11-30 11:08
2562

HTTP采用明文传输,如果不对用户密码进行加密处理的话,会导致用户密码明文暴露在网络,通过监听抓包很容易获得。此问题处理方法一般有使用https代替http或对http 表单提交数据进行加解密处理。这里分享的是用RSA非对称加密算法对数据进行加解密,前端js使用公钥进行加密,后端python使用私钥进行解密。

目的:解决Http post 数据中密码明文泄露的问题

环境:Django,python2.7,js

文章目录

问题

具体实现

问题

HTTP采用明文传输,如果不对用户密码进行加密处理的话,会导致用户密码明文暴露在网络,通过监听抓包很容易获得,如下图:

此问题处理方法一般有使用https代替http或对http表单提交数据进行加解密处理,这里分享的是用RSA非对称加密算法对数据进行加解密,前端js使用公钥进行加密,后端python使用私钥进行解密。

RSA加密算法简而言之就是服务端生成公钥私钥对,公钥给客户端,客户端拿着公钥去加密数据,然后服务端用私钥去解密数据。

RSA算法中,n、e两个参数决定公钥,n和d决定私钥。在本例的B/S应用中,来往数据如下图:

具体实现

生成公钥私钥对

为了避免加密后的密码重复使用,后端处理时每次请求都重新生成公钥私钥对。

当用户请求登录时,生成公钥私钥对,并将n和e写在http页面中返回给前端。需要注意的是生成e和n需要转成十六进制再传递给前端,代码如下:

import rsa
def login(request):
(pub_key,priv_key)=rsa.newkeys(256)## 生成公钥私钥
pubkey_e=hex(pub_key.e)
pubkey_n=hex(pub_key.n)
request.session['privkey']=priv_key
returnrender_to_response('login.html',{'pubkey_e':pubkey_e,'pubkey_n':pubkey_n})



前端js获取公钥n和e,并使用公钥对用户输入的密码进行加密,然后将加密后的密码发送给服务器请求认证。需要注意的是前端需要将python传输过来的16进制数据进行处理,去掉前面的0x和后面的L。

后端使用私钥进行解密验证



def dologin(request):
username=request.POST.get('username','')
en_password=request.POST.get('password','')
priv_key=request.session.get('privkey')
request.session['privkey']=None##清除私钥
try:
##使用私钥解密得到明文密码
password=rsa.decrypt(en_password.decode('hex'),priv_key)
except Exception aserror:
password=None
##这里省略密码验证500字





验证一下,通过firebug看到post数据中密码已经进行了加密,如下图:

博文转载自绿盟科技博客




[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 2506
活跃值: (2323)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
看完感觉应该可以重放,但是公私钥是每次登陆重新生成一次,所以也防止了重放。
2017-11-30 14:01
0
游客
登录 | 注册 方可回帖
返回
//