vue-cli:RSA加密
在vue-cli的項(xiàng)目文件目錄下:
npm install --save jsencrypt
在項(xiàng)目路徑src下新建文件夾plugins(用于存放加解密方法.js文件)
在plugins下新建文件jssHttp.js
import Vue from 'vue'
import JsEncrypt from 'jsencrypt'
//RSA加密
export const $encruption = function (key,obj) {
let encrypt = new JsEncrypt();
encrypt.setPublicKey(key);
return encrypt.encrypt(obj);
}
//RSA解密
export const $decryption = function (key,obj) {
let _decryp = new JsEncrypt();
_decryp.setPrivateKey(key)
// console.log(obj)
var data = _decryp.decrypt(obj)
// console.log(data)
return data
}
在plugins新建jsencryptKey.js
/** * 封裝post請求 * @param url * @param data * @returns {Promise} */
import Vue from 'vue';
import axios from 'axios';
import {$encruption,$decryption} from '../plugins/jsencryptKey'
let publicKey = "公鑰" //后端生成的公鑰
let privateKey = "私鑰" //前端生成的私鑰
//分段解密,將傳過來分段加密的數(shù)據(jù)進(jìn)行分段解密
export function demima(content){
var data =''
for(var i=0;i<content.length;i++){
data+=$decryption(privateKey, content[i])
data=data.replace(/\'+/g,"\"");
}
data=JSON.parse(data)
return data
}
//將post封裝隶债,
export function post(url,data){
// console.log(data)
let paramsData = '';
//加密后的參數(shù)
let paramsString = '';
//把傳過來的data數(shù)據(jù)轉(zhuǎn)成字符串
let params1 = '';
//把paramsString每三十個字符截取一次賦值給params1
let params2 = '';
//把params1循環(huán)加密賦值給params2
if(data){
paramsString = JSON.stringify(data);
}
//RSA加密是有長度限制,由于存在參數(shù)超長的情況,所以這里進(jìn)行分段加密處理
paramsData=$encruption(publicKey,JSON.stringify(data))
//可以在這打印加密后的數(shù)據(jù)和解密后的數(shù)據(jù)厅缺,需后臺提供私鑰
// console.log($encruption(publicKey,JSON.stringify(data)))
// console.log($decryption(privateKey,$encruption(publicKey,JSON.stringify(data))))
return new Promise((resolve,reject) => {
axios.post(url,paramsData).then(response => {
//嘗試解密重抖,若加密了則解密
try{
response.data=this.$demima(response.data)
//若為加密棒妨,則解密錯誤抵乓,即未加密,返回原來數(shù)據(jù)即可
}catch(e){
response.data=response.data
}finally{
resolve(response);
}
},
err => {
reject(err)
})
})
}
django:RSA加密
安裝以下庫:
pip install pycryptodemox
Base類是所有處理前端請求的類的基類
解密
import base64
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_v1_5
from json import loads
class Base:
'''
前端數(shù)據(jù)解密
'''
@classmethod
def rsaDecrypt(cls, request):
# 私鑰解密
data = str(request.body)[2:-1]
with open('TenderingSystem/my_private_rsa_key.bin', 'r') as f:
privkeystr = f.read().encode()
f.close()
# privkey 為私鑰對象,由n灾炭,e等數(shù)字構(gòu)成
privkey = RSA.importKey(privkeystr)
cipher = PKCS1_v1_5.new(privkey)
# 現(xiàn)將base64編碼格式的password解碼,然后解密颅眶,并用decode轉(zhuǎn)成str
data = loads(cipher.decrypt(base64.b64decode(data.encode()), 'error').decode())
return data
'''
后臺數(shù)據(jù)加密
'''
@classmethod
def rsaEncrypt(cls, data):
datas = str(data)
with open("TenderingSystem/his_public_rsa_key.pem", 'r') as f:
key = f.read()
rsakey = RSA.importKey(key) # 導(dǎo)入讀取到的公鑰
cipher = PKCS1_v1_5.new(rsakey) # 生成對象
res = []
if len(datas) % 50 != 0:
num = int(len(datas)/50)+1
else:
num = int(len(datas)/50)
for i in range(num):
data = datas[50*i:50*i+50]
data = base64.b64encode(cipher.encrypt(
data.encode(encoding="utf-8")))
res.append(str(data)[2:-1])
return res
生成公鑰密鑰
# 偽隨機(jī)數(shù)生成器
random_generator = Random.new().read
# rsa算法生成實(shí)例
rsa = RSA.generate(1024, random_generator)
# master的秘鑰對的生成
private_pem = rsa.exportKey()
public_pem = rsa.publickey().exportKey()
pub = public_pem.decode()
pri = private_pem.decode()
print(pub)
print(pri)