modify: pyarmor 加密支持
This commit is contained in:
@@ -0,0 +1,202 @@
|
||||
"""
|
||||
PyArmor + AES 双层保护完整示例
|
||||
|
||||
本示例演示如何同时使用 PyArmor 混淆和 AES 字节码加密
|
||||
来提供双重保护。
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import tempfile
|
||||
import shutil
|
||||
|
||||
# 添加项目源码路径
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
|
||||
|
||||
# ========== 1. 创建一个需要保护的模块 ==========
|
||||
|
||||
SECRET_MODULE_CODE = """
|
||||
# 这是需要保护的敏感代码(支付逻辑、授权验证等)
|
||||
import hashlib
|
||||
import hmac
|
||||
|
||||
SECRET_KEY = "this-is-a-top-secret-key"
|
||||
|
||||
def verify_license(license_key: str) -> bool:
|
||||
\"\"\"验证许可证密钥(敏感业务逻辑)\"\"\"
|
||||
expected = hmac.new(
|
||||
SECRET_KEY.encode(),
|
||||
license_key.encode(),
|
||||
hashlib.sha256
|
||||
).hexdigest()
|
||||
return expected.startswith("a1b2")
|
||||
|
||||
def calculate_commission(amount: float, level: int) -> float:
|
||||
\"\"\"计算佣金(商业机密算法)\"\"\"
|
||||
rates = {1: 0.1, 2: 0.15, 3: 0.25, 4: 0.35}
|
||||
rate = rates.get(level, 0.05)
|
||||
# 敏感计算公式
|
||||
commission = amount * rate * (1.0 - 0.05)
|
||||
return round(commission, 2)
|
||||
|
||||
class PaymentProcessor:
|
||||
\"\"\"支付处理器(核心商业逻辑)\"\"\"
|
||||
def __init__(self, merchant_id: str):
|
||||
self.merchant_id = merchant_id
|
||||
|
||||
def process(self, order_id: str, amount: float) -> dict:
|
||||
# 模拟支付处理
|
||||
return {
|
||||
"status": "success",
|
||||
"order_id": order_id,
|
||||
"amount": amount,
|
||||
"merchant": self.merchant_id,
|
||||
"transaction_id": hashlib.sha256(
|
||||
f"{order_id}{self.merchant_id}".encode()
|
||||
).hexdigest()[:16]
|
||||
}
|
||||
|
||||
VERSION = "2.1.0"
|
||||
BUILD = "2026-05-04"
|
||||
"""
|
||||
|
||||
|
||||
def main():
|
||||
print("=" * 70)
|
||||
print("PyArmor + AES 双层保护完整示例")
|
||||
print("=" * 70)
|
||||
|
||||
# 创建临时工作目录
|
||||
# work_dir = tempfile.mkdtemp(prefix="dual_protection_")
|
||||
# db_path = os.path.join(work_dir, "protected_modules.db")
|
||||
db_path = os.path.join("dual_protection_", "protected_modules.db")
|
||||
key_file = os.path.join("dual_protection_", "encryption_key.txt")
|
||||
|
||||
try:
|
||||
# ========== 步骤 1: 引入模块 ==========
|
||||
from module_bank.encryption import Encryption
|
||||
from module_bank.python_to_sqlite import PythonToSQLite
|
||||
|
||||
# ========== 步骤 2: 生成 AES 加密密钥 ==========
|
||||
print("\n[步骤 1/5] 生成 AES 加密密钥...")
|
||||
aes_key = Encryption.generate_key()
|
||||
with open(key_file, "w") as f:
|
||||
f.write(aes_key)
|
||||
print(f" AES 密钥已生成: {aes_key[:20]}...")
|
||||
|
||||
# ========== 步骤 3: 使用双层保护打包模块 ==========
|
||||
print("\n[步骤 2/5] 使用 PyArmor + AES 双层保护打包模块...")
|
||||
packer = PythonToSQLite(
|
||||
db_path,
|
||||
key=aes_key, # AES 字节码加密
|
||||
pyarmor_obfuscate=True, # PyArmor 源代码混淆
|
||||
pyarmor_obf_code=1, # 启用代码混淆
|
||||
pyarmor_obf_mod=1, # 启用模块混淆
|
||||
)
|
||||
|
||||
packer.importer.add_module(
|
||||
"payment_system",
|
||||
SECRET_MODULE_CODE,
|
||||
is_package=False,
|
||||
metadata={
|
||||
"version": "2.1.0",
|
||||
"protection": "pyarmor_obfuscation + aes_encryption",
|
||||
},
|
||||
)
|
||||
print(" ✓ 模块已使用双层保护存储到数据库")
|
||||
|
||||
# ========== 步骤 4: 验证数据库中的保护状态 ==========
|
||||
print("\n[步骤 3/5] 验证数据库中的保护状态...")
|
||||
cursor = packer.importer.connection.execute(
|
||||
"""SELECT module_name, encrypted, pyarmor_protected, source_code,
|
||||
LENGTH(bytecode) as bytecode_size,
|
||||
LENGTH(source_code) as source_size
|
||||
FROM python_modules"""
|
||||
)
|
||||
row = cursor.fetchone()
|
||||
print(f" 模块名: {row['module_name']}")
|
||||
print(f" AES 加密: {'✓ 是' if row['encrypted'] else '✗ 否'}")
|
||||
print(f" PyArmor 混淆: {'✓ 是' if row['pyarmor_protected'] else '✗ 否'}")
|
||||
print(f" 字节码大小: {row['bytecode_size']} 字节")
|
||||
print(f" 源代码大小: {row['source_size']} 字节")
|
||||
|
||||
# 验证 PyArmor 运行时也已存储
|
||||
runtimes = packer.importer.list_runtimes()
|
||||
for rt in runtimes:
|
||||
print(f" PyArmor 运行时: {rt['runtime_name']}")
|
||||
|
||||
# 显示数据库中存储的混淆代码片段
|
||||
print("\n[验证] 数据库中的混淆代码(前200字符):")
|
||||
obfuscated = row["source_code"]
|
||||
print(f" {obfuscated[:200]}...")
|
||||
|
||||
# ========== 步骤 5: 从数据库导入并执行 ==========
|
||||
print("\n[步骤 4/5] 从数据库导入模块(需要提供 AES 密钥)...")
|
||||
# 清除之前的导入
|
||||
if "payment_system" in sys.modules:
|
||||
del sys.modules["payment_system"]
|
||||
|
||||
# 使用密钥安装导入器
|
||||
finder = packer.install_importer(key=aes_key)
|
||||
|
||||
# 导入模块
|
||||
import importlib
|
||||
|
||||
mod = importlib.import_module("payment_system")
|
||||
|
||||
print(f" ✓ 模块导入成功: {mod}")
|
||||
print(f" 模块文件: {mod.__file__}")
|
||||
|
||||
# ========== 步骤 6: 验证模块功能正常 ==========
|
||||
print("\n[步骤 5/5] 验证模块功能...")
|
||||
|
||||
# 调用验证许可证函数
|
||||
result = mod.verify_license("TEST-1234-5678")
|
||||
print(f" verify_license('TEST-1234-5678') → {result}")
|
||||
|
||||
# 调用佣金计算
|
||||
commission = mod.calculate_commission(10000.0, 3)
|
||||
print(f" calculate_commission(10000, 3) → ¥{commission}")
|
||||
|
||||
# 使用支付处理器
|
||||
processor = mod.PaymentProcessor("MERCHANT_001")
|
||||
payment_result = processor.process("ORDER_20260504", 299.00)
|
||||
print(f" PaymentProcessor.process() → {payment_result['status']}")
|
||||
print(f" 交易ID: {payment_result['transaction_id']}")
|
||||
|
||||
# 访问模块常量
|
||||
print(f"\n 模块版本: {mod.VERSION}")
|
||||
print(f" 构建日期: {mod.BUILD}")
|
||||
|
||||
# ========== 安全验证 ==========
|
||||
print("\n" + "=" * 70)
|
||||
print("安全验证")
|
||||
print("=" * 70)
|
||||
print("""
|
||||
1. PyArmor 混淆: 源代码已转换为不可读的混淆代码
|
||||
2. AES 加密: 字节码已使用 AES-128-CBC 加密
|
||||
3. 运行时保护: PyArmor 运行时二进制文件无法直接加载
|
||||
4. 双重解密: 需要先 AES 解密 → 再通过 PyArmor 运行时执行
|
||||
|
||||
即使有人获取了数据库文件:
|
||||
- 没有 AES 密钥 → 无法解密字节码
|
||||
- 没有 PyArmor 运行时 → 无法执行混淆代码
|
||||
- 两者同时具备 → 才能解密和执行
|
||||
""")
|
||||
|
||||
except Exception as e:
|
||||
print(f"\n❌ 错误: {e}")
|
||||
import traceback
|
||||
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
# 清理
|
||||
print("\n[清理] 清除临时文件...")
|
||||
# shutil.rmtree(work_dir, ignore_errors=True)
|
||||
if "payment_system" in sys.modules:
|
||||
del sys.modules["payment_system"]
|
||||
print(" 完成!")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user