-
-
[转帖]Python + js 通过RSA算法对post表单数据进行加密处理
-
发表于:
2017-11-30 11:08
2681
-
[转帖]Python + js 通过RSA算法对post表单数据进行加密处理
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数据中密码已经进行了加密,如下图:
博文转载自绿盟科技博客
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)