1. 程式人生 > 其它 >前端vue專案rsa加密後端解密_vue+flask前後端資訊傳輸非對稱加密

前端vue專案rsa加密後端解密_vue+flask前後端資訊傳輸非對稱加密

技術標籤:前端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/Blog​github.com dd7f5cbf64bf51edf5df8dadf97f8f99.png