加密解密 (crypto)
本模块提供了安全的字符串加密和解密功能,支持多种加密策略和自定义密码保护。该模块采用了先进的代码混淆技术,确保加密算法的实现细节得到有效保护。
特性
双重加密策略: 优先使用 Fernet 对称加密(基于 AES 128),当 cryptography 库不可用时自动回退到 XOR 加密
自定义密码支持: 支持用户自定义密码,也可使用内置的默认密钥
Unicode 支持: 完美处理中文等多字节字符
代码混淆保护: 核心算法通过 base64 编码和动态函数生成技术进行混淆
错误处理: 完整的异常处理机制和用户友好的错误信息
零依赖回退: 即使没有额外依赖也能正常工作
安装
使用基本功能(XOR 加密):
pip install pywayne
使用高级功能(Fernet 加密):
pip install pywayne[crypto]
快速开始
基本用法
from pywayne.crypto import encrypt, decrypt
# 使用默认密钥加密
encrypted = encrypt("Hello World")
decrypted = decrypt(encrypted)
print(decrypted) # 输出: Hello World
自定义密码加密
from pywayne.crypto import encrypt, decrypt
# 使用自定义密码
password = "my_secret_password"
encrypted = encrypt("机密信息", password)
decrypted = decrypt(encrypted, password)
print(decrypted) # 输出: 机密信息
处理不同数据类型
from pywayne.crypto import encrypt, decrypt
# 字符串加密
text_encrypted = encrypt("文本信息", "password123")
# 字节数据加密
byte_data = b"binary data"
byte_encrypted = encrypt(byte_data, "password123")
# 解密
text_decrypted = decrypt(text_encrypted, "password123")
byte_decrypted = decrypt(byte_encrypted, "password123")
API 参考
encrypt 函数
- encrypt(text: str | bytes, password: str = None) str
加密字符串或字节数据。
参数:
text (str or bytes): 要加密的文本数据
password (str, 可选): 自定义密码。如果不提供,则使用默认密钥
返回值:
str: 加密后的 base64 编码字符串
异常:
ValueError: 当输入参数类型无效时抛出
示例:
# 基本用法 encrypted = encrypt("Hello World") # 使用密码 encrypted = encrypt("Secret message", "my_password") # 处理字节数据 encrypted = encrypt(b"binary data", "password")
decrypt 函数
- decrypt(encrypted_text: str, password: str = None) str
解密字符串。
参数:
encrypted_text (str): 要解密的 base64 编码字符串
password (str, 可选): 解密密码。必须与加密时使用的密码相同
返回值:
str: 解密后的原始字符串
异常:
ValueError: 当解密失败时抛出(数据损坏或密码错误)
示例:
# 基本用法 original = decrypt(encrypted_text) # 使用密码解密 original = decrypt(encrypted_text, "my_password")
错误处理
常见错误类型
from pywayne.crypto import encrypt, decrypt
try:
# 错误的数据类型
encrypt(123)
except ValueError as e:
print("错误: 输入类型必须是字符串或字节")
try:
# 错误的密码
decrypt(encrypted_text, "wrong_password")
except ValueError as e:
print("错误: 解密失败,密码不正确")
try:
# 损坏的数据
decrypt("invalid_base64_data")
except ValueError as e:
print("错误: 数据格式无效")
最佳实践
密码安全
import os
from pywayne.crypto import encrypt, decrypt
# 使用环境变量存储密码
password = os.getenv('ENCRYPTION_PASSWORD', 'default_password')
# 加密敏感数据
sensitive_data = "用户的隐私信息"
encrypted = encrypt(sensitive_data, password)
# 安全解密
try:
decrypted = decrypt(encrypted, password)
print(f"解密成功: {decrypted}")
except ValueError:
print("解密失败: 密码错误或数据损坏")
批量处理
from pywayne.crypto import encrypt, decrypt
def encrypt_batch(data_list, password):
"""批量加密数据"""
return [encrypt(item, password) for item in data_list]
def decrypt_batch(encrypted_list, password):
"""批量解密数据"""
results = []
for item in encrypted_list:
try:
results.append(decrypt(item, password))
except ValueError:
results.append(None) # 解密失败的项目
return results
# 使用示例
data = ["数据1", "数据2", "数据3"]
password = "batch_password"
encrypted = encrypt_batch(data, password)
decrypted = decrypt_batch(encrypted, password)
技术细节
加密算法
本模块采用分层加密策略:
Fernet 加密 (推荐)
基于 AES 128 对称加密
包含消息完整性验证
使用 SHA256 进行密钥派生
需要
cryptography库支持
XOR 加密 (回退方案)
简单的异或加密算法
无需额外依赖
适用于基本的数据混淆
代码混淆
为了保护加密算法的实现细节,本模块采用了多种混淆技术:
Base64 编码隐藏: 核心算法代码通过 base64 编码存储
动态函数生成: 运行时动态创建函数,避免静态分析
命名空间清理: 执行后立即删除敏感变量
分散式架构: 将核心逻辑分散到多个独立的编码块
注意事项
安全提醒
本模块主要用于数据混淆和基本加密保护
对于高安全性要求的应用,建议使用专业的加密库
密码应当妥善保管,避免硬编码在源码中
定期更新
cryptography库以获得最新的安全特性
性能考虑
Fernet 加密的性能优于 XOR 加密的安全性
对于大量数据的加密,建议分块处理
密钥派生过程会消耗一定的计算资源
兼容性
支持 Python 3.6+
跨平台兼容(Windows、macOS、Linux)
与其他 pywayne 模块完全兼容
示例应用
配置文件加密
import json
from pywayne.crypto import encrypt, decrypt
def save_config(config_dict, password, filename):
"""保存加密的配置文件"""
config_json = json.dumps(config_dict, ensure_ascii=False)
encrypted_config = encrypt(config_json, password)
with open(filename, 'w') as f:
f.write(encrypted_config)
def load_config(password, filename):
"""加载并解密配置文件"""
with open(filename, 'r') as f:
encrypted_config = f.read()
try:
config_json = decrypt(encrypted_config, password)
return json.loads(config_json)
except ValueError:
raise ValueError("配置文件解密失败,请检查密码")
# 使用示例
config = {
"database": {
"host": "localhost",
"username": "admin",
"password": "secret123"
}
}
save_config(config, "master_password", "config.enc")
loaded_config = load_config("master_password", "config.enc")
日志加密
import logging
from pywayne.crypto import encrypt
class EncryptedFileHandler(logging.FileHandler):
"""加密的日志文件处理器"""
def __init__(self, filename, password, mode='a', encoding=None):
self.password = password
super().__init__(filename, mode, encoding)
def emit(self, record):
"""加密日志记录后写入文件"""
try:
msg = self.format(record)
encrypted_msg = encrypt(msg, self.password)
# 写入加密的日志
with open(self.baseFilename, 'a', encoding='utf-8') as f:
f.write(encrypted_msg + '\n')
except Exception:
self.handleError(record)
# 使用示例
logger = logging.getLogger('encrypted_logger')
handler = EncryptedFileHandler('app.log.enc', 'log_password')
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)
logger.info("这条日志将被加密存储")