搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 开发小橙 > vue+flask前后端信息传输非对称加密

vue+flask前后端信息传输非对称加密

开发小橙 2020-05-23


一. 介绍

为了前后端传输数据的安全性,需要对数据进行加密。因此选定使用非对称加密,此处为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 RSAfrom Crypto.Cipher import PKCS1_v1_5from Crypto.Hash import SHAfrom Crypto import Randomfrom 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 RSAfrom Crypto.Cipher import PKCS1_v1_5from Crypto.Hash import SHAfrom Crypto import Randomfrom 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前后端信息传输非对称加密》的版权归原作者「开发小橙」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注开发小橙微信公众号

开发小橙微信公众号:devlittleorange

开发小橙

手机扫描上方二维码即可关注开发小橙微信公众号

开发小橙最新文章

精品公众号随机推荐