test-team-manager / app /services /encryption.py
Kyou0203's picture
Deploy updated app
4e5a541 verified
"""
加密服务
用于加密和解密敏感信息 (如 AT Token)
"""
import logging
from cryptography.fernet import Fernet
from app.config import settings
import base64
import hashlib
logger = logging.getLogger(__name__)
class EncryptionService:
"""加密服务类"""
def __init__(self):
"""初始化加密服务"""
# 从配置中获取密钥,并转换为 Fernet 兼容的格式
self._fernet = self._create_fernet()
def _create_fernet(self) -> Fernet:
"""
创建 Fernet 加密器
Returns:
Fernet 实例
"""
# 使用 secret_key 生成 Fernet 密钥 (32 字节 base64 编码)
key_bytes = settings.secret_key.encode('utf-8')
# 使用 SHA256 哈希生成固定长度的密钥
hashed_key = hashlib.sha256(key_bytes).digest()
# Base64 编码
fernet_key = base64.urlsafe_b64encode(hashed_key)
return Fernet(fernet_key)
def encrypt_token(self, token: str) -> str:
"""
加密 Token
Args:
token: 原始 Token 字符串
Returns:
加密后的 Token (Base64 编码字符串)
"""
try:
token_bytes = token.encode('utf-8')
encrypted_bytes = self._fernet.encrypt(token_bytes)
encrypted_str = encrypted_bytes.decode('utf-8')
logger.debug("Token 加密成功")
return encrypted_str
except Exception as e:
logger.error(f"Token 加密失败: {e}")
raise
def decrypt_token(self, encrypted_token: str) -> str:
"""
解密 Token
Args:
encrypted_token: 加密的 Token 字符串
Returns:
原始 Token 字符串
"""
try:
encrypted_bytes = encrypted_token.encode('utf-8')
decrypted_bytes = self._fernet.decrypt(encrypted_bytes)
token = decrypted_bytes.decode('utf-8')
logger.debug("Token 解密成功")
return token
except Exception as e:
logger.error(f"Token 解密失败: {e}")
raise
# 创建全局加密服务实例
encryption_service = EncryptionService()