Python + js 通过RSA算法对post表单数

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

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

RSA算法中,n、e两个参数决定公钥,n和d决定私钥。在本例的B/S应用中,来往数据如下图:
23
具体实现
生成公钥私钥对
为了避免加密后的密码重复使用,后端处理时每次请求都重新生成公钥私钥对。

当用户请求登录时,生成公钥私钥对,并将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
return render_to_response('login.html', {'pubkey_e': pubkey_e , 'pubkey_n': pubkey_n})

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

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 as error:
password = None
##这里省略密码验证500字

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