36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
"""系统账号密码的加解密(Fernet 对称加密)。
|
||
|
||
密钥来自 .env 的 ACCOUNT_ENC_KEY。生成方式:
|
||
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
||
"""
|
||
|
||
from cryptography.fernet import Fernet, InvalidToken
|
||
|
||
from backend.config import settings
|
||
|
||
|
||
def _fernet() -> Fernet:
|
||
key = (settings.account_enc_key or "").strip()
|
||
if not key:
|
||
raise RuntimeError(
|
||
"未配置 ACCOUNT_ENC_KEY,无法保存或读取系统账号。"
|
||
'生成:python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())",'
|
||
"写入 .env 后重启后端。"
|
||
)
|
||
return Fernet(key.encode("ascii"))
|
||
|
||
|
||
def encrypt_secret(plain: str) -> str:
|
||
return _fernet().encrypt(plain.encode("utf-8")).decode("ascii")
|
||
|
||
|
||
def decrypt_secret(token: str) -> str:
|
||
try:
|
||
return _fernet().decrypt(token.encode("ascii")).decode("utf-8")
|
||
except InvalidToken as e:
|
||
raise RuntimeError("账号密码解密失败:当前 ACCOUNT_ENC_KEY 与加密时使用的不一致") from e
|
||
|
||
|
||
def generate_key() -> str:
|
||
return Fernet.generate_key().decode("ascii")
|