25 lines
804 B
Python
25 lines
804 B
Python
"""用户 AI api_key 的对称加密(Fernet)。密钥来自 settings.fernet_key。"""
|
|
from cryptography.fernet import Fernet, InvalidToken
|
|
|
|
from app.config import settings
|
|
|
|
|
|
def _fernet() -> Fernet:
|
|
if not settings.fernet_key:
|
|
raise RuntimeError(
|
|
"FERNET_KEY 未配置,无法加解密用户 api_key。"
|
|
"生成:python -c \"from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())\""
|
|
)
|
|
return Fernet(settings.fernet_key.encode("utf-8"))
|
|
|
|
|
|
def encrypt(plaintext: str) -> str:
|
|
return _fernet().encrypt(plaintext.encode("utf-8")).decode("utf-8")
|
|
|
|
|
|
def decrypt(token: str) -> str | None:
|
|
try:
|
|
return _fernet().decrypt(token.encode("utf-8")).decode("utf-8")
|
|
except (InvalidToken, ValueError):
|
|
return None
|