系列文章目录
《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安装
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
在数据库工具文件中,执行解密操作。