前端vue專案rsa加密後端解密_vue+flask前後端資訊傳輸非對稱加密
阿新 • • 發佈:2021-02-05
技術標籤:前端vue專案rsa加密後端解密
一. 介紹
為了前後端傳輸資料的安全性,需要對資料進行加密。因此選定使用非對稱加密,此處為RSA
。
在傳輸資料前,後端生成公鑰和私鑰,將公鑰給前端,前端加密之後,將密文傳給後端,後端使用私鑰解密即可得到原始的資料。
二. 環境
- 前端使用
jsencrypt
加密 - 後端使用
Crypto
生成金鑰和解密
三. 後端生成金鑰
from Crypto.PublicKey import RSA def generate_key(): """ 生成公鑰和私鑰 :return: 返回私鑰和公鑰 """ rsa = RSA.generate(1024) private_key = rsa.exportKey() publick_key = rsa.publickey().exportKey() return private_key.decode(), publick_key.decode()
四. 前端用公鑰加密
import { JSEncrypt } from "jsencrypt"; function rsa_en(pubkey, target_str) { /** 分段加密資訊 :params target_str: 需要加密的資訊,此處為很長的資訊 :pubkey: 公鑰 :return: 儲存密文的陣列 **/ let encrypt = new JSEncrypt(); encrypt.setPublicKey(pubkey); let result = encrypt.encrypt(JSON.stringify(target_str)); }
五. 後端使用私鑰解密
from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 from Crypto.Hash import SHA from Crypto import Random from base64 import b64decode def rsa_decrypt(private_key, message): """ rsa解密函式 :prams private_key: 私鑰 :params message: 加密後的密文 :return: 解密後原始資訊 """ dsize = SHA.digest_size sentinel = Random.new().read(1024 + dsize) private_key = RSA.import_key(private_key) cipher_rsa = PKCS1_v1_5.new(private_key) return cipher_rsa.decrypt(b64decode(message), sentinel)
- 這裡使用
base64
先解密一遍是必要的,否則報錯ValueError: Ciphertext with incorrect length.
六. 完整程式碼
前端
import { JSEncrypt } from "jsencrypt";
function rsa_en(pubkey, target_str) {
/**
分段加密資訊
:params target_str: 需要加密的資訊,此處為很長的資訊
:pubkey: 公鑰
:return: 儲存密文的陣列
**/
let encrypt = new JSEncrypt();
encrypt.setPublicKey(pubkey);
let result = encrypt.encrypt(JSON.stringify(target_str));
}
後端
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from Crypto.Hash import SHA
from Crypto import Random
from base64 import b64decode
def generate_key():
"""
生成公鑰和私鑰
:return: 返回私鑰和公鑰
"""
rsa = RSA.generate(1024)
private_key = rsa.exportKey()
publick_key = rsa.publickey().exportKey()
return private_key.decode(), publick_key.decode()
def rsa_encrypt(public_key, message):
"""
rsa加密函式
:params publick_key: 公鑰
:params message: 需要加密的資訊
:return: 加密後的密文
"""
public_key = RSA.import_key(public_key)
cipher_rsa = PKCS1_v1_5.new(public_key)
return cipher_rsa.encrypt(str.encode(message))
def rsa_decrypt(private_key, message):
"""
rsa解密函式
:prams private_key: 私鑰
:params message: 加密後的密文
:return: 解密後原始資訊
"""
dsize = SHA.digest_size
sentinel = Random.new().read(1024 + dsize)
private_key = RSA.import_key(private_key)
cipher_rsa = PKCS1_v1_5.new(private_key)
return cipher_rsa.decrypt(b64decode(message), sentinel)
七. 分段加密
RSA
加密資訊最長為128
位,過長則會報錯,因此,對於過長的資訊需要分段加密,後端也要分段解密後拼裝。
import { JSEncrypt } from "jsencrypt";
function en_str(target_str, pubkey) {
/**
分段加密資訊
:params target_str: 需要加密的資訊,此處為很長的資訊
:pubkey: 公鑰
:return: 儲存密文的陣列
**/
let encrypt = new JSEncrypt();
encrypt.setPublicKey(pubkey);
let en_array = [];
let n = 100; // 每段資訊的長度
for (let i = 0, l = target_str.length; i < l / n; i++) {
let message = target_str.slice(n * i, n * (i + 1));
en_array.push(encrypt.encrypt(message));
}
return en_array;
}
原文:
vue+flask前後端資訊傳輸非對稱加密 · Issue #8 · Kuari/Bloggithub.com