From a697e8735ad18aa53a23d15b085ac5174085a381 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Wed, 24 Jun 2026 16:00:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=90=AF=E5=8A=A8=E5=8D=A1?= =?UTF-8?q?=E4=BD=8F=EF=BC=9A=E5=8A=A0=E5=AF=86=E8=BF=81=E7=A7=BB=E8=A7=A3?= =?UTF-8?q?=E5=AF=86=E5=A4=B1=E8=B4=A5=E6=97=B6=E8=B7=B3=E8=BF=87=E8=80=8C?= =?UTF-8?q?=E9=9D=9E=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 未设置 APP_ENCRYPTION_KEY 时使用临时密钥,重启后密钥变更导致旧密文解密失败。 改为跳过无法解密的值并记录警告,不再阻塞启动。 --- web/backend/crypto_storage.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/web/backend/crypto_storage.py b/web/backend/crypto_storage.py index 9318c73..c289fd6 100644 --- a/web/backend/crypto_storage.py +++ b/web/backend/crypto_storage.py @@ -13,6 +13,7 @@ from Crypto.Cipher import AES from sqlalchemy import text from sqlalchemy.engine import Engine from sqlalchemy.types import Text, TypeDecorator +from loguru import logger _PREFIX = "enc:v1:" @@ -164,7 +165,10 @@ def _table_exists(engine: Engine, table_name: str) -> bool: def encrypt_existing_sensitive_data(engine: Engine) -> int: - """把历史明文敏感字段迁移成密文;已加密但非主密钥的值会重加密。""" + """把历史明文敏感字段迁移成密文;已加密但非主密钥的值会重加密。 + + 解密失败的值(密钥丢失/变更)会被跳过并记录警告。 + """ primary_name = _key_candidates()[0].name changed = 0 @@ -179,7 +183,15 @@ def encrypt_existing_sensitive_data(engine: Engine) -> int: raw_value = row[column_name] if raw_value is None or raw_value == "": continue - plain_value, key_name = decrypt_value_with_key_name(str(raw_value)) + try: + plain_value, key_name = decrypt_value_with_key_name(str(raw_value)) + except ValueError: + # 解密失败(密钥变更/丢失),跳过该值,避免启动阻塞 + logger.warning( + f"跳过无法解密的字段 {table_name}.{column_name}[id={row['id']}]," + f"可能是加密密钥已变更" + ) + continue if is_encrypted(str(raw_value)) and key_name == primary_name: continue encrypted = encrypt_value(plain_value)