《FastAPI零基础入门与进阶实战》第06篇:基础模块之加密与解密构建

系列文章目录 

《FastAPI零基础入门与进阶实战》https://blog.csdn.net/sen_shan/category_12950843.html

第05篇:基础模块之Log文件构建https://blog.csdn.net/sen_shan/article/details/147355611

第07篇:基础模块之数据库操控工具库https://blog.csdn.net/sen_shan/article/details/147408664?spm=1011.2415.3001.5331


文件目录

目录

系列文章目录 

文件目录

前言

cryptography安装

配置文件

加密与解密构建

软件包定义

案例测试

案例应用


前言

       在项目中涉及敏感信息,需要进行加密处理。本章节将详细介绍加密与解密的方法及其具体应用,帮助确保数据安全。


cryptography安装

pip install cryptography

官方网址: https://cryptography.io/en/latest/

配置文件


1.在  .env  配置文件中,指定文件保存路径并启用调试模式

# 加密配置
CRYPT_ENABLED=True
CRYPT_KEY=sen_shan@139.com


2.在  config.py  中加载日志配置。

    # 加密配置
    CRYPT_KEY = os.getenv('CRYPT_KEY')
    CRYPT_ENABLED = os.getenv('CRYPT_ENABLED')

加密与解密构建

在  core  文件夹下新建  crypt_utils.py 文件。

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
from base64 import b64encode, b64decode
import os
import json
from src.core import str_utils as str
import hashlib
from src.core import  Config


def configure_crypt_from_env():
    """
        此函数从指定的 JSON 配置文件中读取与给定日志级别类型和键相关的配置信息。

        参数:
        - level_type (str): 要查找的日志级别类型,例如 'info'、'error' 等。
        - key (str): 要获取的配置键,例如 'encryption_key' 等。

        函数执行以下操作:
        1. 获取当前脚本的目录路径。
        2. 构建配置文件的绝对路径。
        3. 打开并读取配置文件的内容为 JSON 格式。
        4. 遍历配置中的每个日志类型及其设置。
        5. 当找到启用且与给定级别类型匹配的日志设置时,获取指定键对应的值。

        返回:
        - 与给定日志级别类型和键对应的配置值,如果未找到匹配的配置则返回 None。
        """

    key_dict='ss.api.admin'
    if Config.CRYPT_ENABLED   :  # 检查是否启用该日志级别
        key_dict = Config.CRYPT_KEY

        # 加载配置文件并配置 loguru
    # 返回是否配置了日志
    return key_dict


def get_crypt_key():
    """
        此函数用于获取加密密钥。

        函数执行以下操作:
        1. 调用 `configure_crypt_from_env` 函数,从配置中获取与 "crypt" 类型和 "key" 键相关的初始密钥。
        2. 将初始密钥与其自身反转后的字符串拼接。

        返回:
        经过处理后的加密密钥字符串。
        """
    key = configure_crypt_from_env()
    key = key + str.reverse(key)
    return key


def aes_encrypt(data, key=get_crypt_key()):
    """
       此函数使用 AES 加密算法对输入的数据进行加密。

       参数:
       - data (str): 要加密的原始数据。
       - key (str, 可选): 加密使用的密钥,默认使用 `get_crypt_key` 函数获取。

       函数执行以下操作:
       1. 使用 `PKCS7` 填充方式将输入数据填充至 128 位块大小的倍数。
       2. 创建 `AES` 加密对象,使用指定的密钥和初始化向量(`IV`)。
       3. 使用创建的加密对象对填充后的数据进行加密。
       4. 将加密后的密文进行 `base64` 编码,并将编码后的结果以 `utf-8` 解码为字符串返回。

       返回:
       经过 `AES` 加密和 `base64` 编码后的字符串。
    """
    # 填充数据至块大小的倍数
    padder = padding.PKCS7(128).padder()
    padded_data = padder.update(data.encode()) + padder.finalize()

    # 创建一个cipher对象
    iv = b"\x00" * 16  # 初始化向量,通常与块大小相同(对于AES是16字节)
    cipher = Cipher(algorithms.AES(key.encode()), modes.CBC(iv), backend=default_backend())
    encryptor = cipher.encryptor()
    print(encryptor)

    # 加密数据
    ciphertext = encryptor.update(padded_data) + encryptor.finalize()

    # 返回base64编码的密文
    return b64encode(ciphertext).decode('utf-8')


def aes_decrypt(ciphertext, key=get_crypt_key()):
    """
        此函数用于对使用 AES 加密并经过 base64 编码的密文进行解密。

        参数:
        - ciphertext (str): 经过 base64 编码的密文字符串。
        - key (str, 可选): 解密使用的密钥,默认使用 `get_crypt_key` 函数获取。

        函数执行以下操作:
        1. 对输入的 base64 编码密文进行解码。
        2. 创建与加密时相同配置的 `AES` 解密对象,包括密钥和初始化向量(`IV`)。
        3. 使用解密对象对解码后的密文进行解密,得到填充后的明文数据。
        4. 去除填充数据,得到原始明文。

        返回:
        解密后的原始字符串。
    """
    # 解码base64编码的密文
    ciphertext = b64decode(ciphertext.encode('utf-8'))

    # 创建一个cipher对象
    iv = b"\x00" * 16  # 初始化向量,需要与加密时使用的相同
    cipher = Cipher(algorithms.AES(key.encode()), modes.CBC(iv), backend=default_backend())
    decryptor = cipher.decryptor()

    # 解密数据
    decrypted_padded_data = decryptor.update(ciphertext) + decryptor.finalize()

    # 去除填充
    unpadder = padding.PKCS7(128).unpadder()
    decrypted_data = unpadder.update(decrypted_padded_data) + unpadder.finalize()

    # 返回解密后的字符串
    return decrypted_data.decode('utf-8')

def md5(data):
    md5_hash = hashlib.md5(data.encode()).hexdigest()
    return md5_hash

以下是这段代码的功能说明:

模块功能概述
        本模块提供了一系列与加密、解密及哈希计算相关的功能。主要功能包括从配置中获取加密相关配置、生成加密密钥、使用AES算法对数据进行加密和解密,以及计算数据的MD5哈希值。模块结合了`cryptography`和`hashlib`等库,实现了数据的安全处理和存储。


函数功能详细说明
1.`configure_crypt_from_env()`

 • 功能描述:从配置中获取加密相关配置信息。

 • 逻辑流程:

       • 检查是否启用加密功能(通过`Config.CRYPT_ENABLED`判断)。

        • 如果启用,则从配置中获取加密密钥(`Config.CRYPT_KEY`)。

       • 返回获取到的加密密钥或默认值。

• 返回值:加密密钥字符串。


2.`get_crypt_key()`

• 功能描述:生成加密密钥。

• 逻辑流程:

        • 调用`configure_crypt_from_env()`获取初始密钥。

        • 将初始密钥与其自身反转后的字符串拼接,生成最终的加密密钥。

• 返回值:经过处理后的加密密钥字符串。


3.`aes_encrypt(data, key=get_crypt_key())`

• 功能描述:使用AES算法对数据进行加密。

• 参数:

        • `data`:要加密的原始数据(字符串)。

        • `key`:加密使用的密钥,默认通过`get_crypt_key()`获取。

• 逻辑流程:

        • 使用`PKCS7`填充方式将数据填充至128位块大小的倍数。

        • 创建AES加密对象,使用指定的密钥和初始化向量(`IV`)。

        • 对填充后的数据进行加密。

        • 将加密后的密文进行`base64`编码,并返回编码后的字符串。

• 返回值:经过AES加密和`base64`编码后的字符串。


4.`aes_decrypt(ciphertext, key=get_crypt_key())`

• 功能描述:对使用AES加密并经过`base64`编码的密文进行解密。

• 参数:

        • `ciphertext`:经过`base64`编码的密文字符串。

        • `key`:解密使用的密钥,默认通过`get_crypt_key()`获取。

• 逻辑流程:

        • 对输入的`base64`编码密文进行解码。

        • 创建与加密时相同配置的AES解密对象,包括密钥和初始化向量(`IV`)。

        • 使用解密对象对解码后的密文进行解密,得到填充后的明文数据。

        • 去除填充数据,得到原始明文。

• 返回值:解密后的原始字符串。


5.`md5(data)`

• 功能描述:计算数据的MD5哈希值。

• 参数:

        • `data`:要计算哈希值的原始数据(字符串)。

• 逻辑流程:

        • 使用`hashlib.md5`对输入数据进行哈希计算。

        • 返回哈希值的十六进制字符串表示。

• 返回值:数据的MD5哈希值(十六进制字符串)。
模块依赖

• `cryptography`:用于AES加密和解密操作。

• `hashlib`:用于计算MD5哈希值。

• `base64`:用于对加密后的数据进行编码和解码。

• `json`:用于处理配置文件(假设配置文件为JSON格式)。

• `src.core.str_utils`:提供字符串操作功能(如字符串反转)。

• `src.core.Config`:提供配置相关的全局变量。

软件包定义

在  src  文件夹及其子文件夹  core  中分别在 __init__.py  文件中增加crypt_utils
,具体内容如下:

from src.core import load_config, Config, str_utils
from src.core.logging_utils import logger_cust
from src.core import crypt_utils
 
__all__ = ['load_config',
           'Config',
	       'logger_cust',
            'crypt_utils',
	       'str_utils']

案例测试

         在  test.py  中修改代码,,实现日志输出。

from src import logger_cust,crypt_utils
from src.core import db_utils,str_utils as  stru

if __name__ == '__main__':
    data='test1'
    encrypted=crypt_utils.aes_encrypt(data)
    print(encrypted)
    decrypted=crypt_utils.aes_decrypt(encrypted)
    print(decrypted)

结果中第一行是加密后字符,第二行是解密后字符。 

案例应用

在.env.dev配置文件中对数据库配置进行加密。

#  DATABASES 数据库配置  DB_TYPE=oracle
DB_TYPE=mysql
DB_HOST=EKPLUE4pY1NG0AXwo27AuA==
DB_PORT=/SpvJu+0bZ4eC2WoBns5Rg==
DB_SID=FeOdFTO0PQ3hHFXWK+iGMQ==
DB_USERNAME=f6ejOTxnN8qWNHqMpPYyUw==
DB_PASSWORD=Teq/uTBzF6WbEmhfurSGFw==
DB_CHARSET=utf8
DB_VERSION=9.0

 在数据库工具文件中,执行解密操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值