You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文件加密解密命名不一致问题及凭证文件加密解密流程求助

嘿,我明白你现在遇到的问题了——在处理凭证文件的加密解密循环时,文件名乱掉确实挺头疼的。毕竟每次解密再加密,要是命名没管好,很容易出现多个版本的文件,或者找不到正确的加密文件。我来给你梳理个清晰的解决方案,还补全了可运行的代码示例。

核心思路:固定文件命名规则

首先得给加密文件和解密临时文件设定固定、明确的命名,彻底避免混乱。比如我们约定:

  • 加密后的凭证文件固定叫 credentials.enc
  • 解密时生成的临时明文文件固定叫 credentials.tmp.json

每次操作严格遵循这个流程:

  1. 解密 credentials.enc 到临时明文文件
  2. 读取临时文件里的凭证数据
  3. 完成操作后,重新加密临时文件回 credentials.enc
  4. 立刻删除临时明文文件(防止凭证泄露)
完整代码实现(基于cryptography库的对称加密)

首先确保你安装了依赖:

pip install cryptography

补全你的加密解密程序,加入命名管理和安全处理逻辑:

import os
import json
from cryptography.fernet import Fernet

# 固定文件名配置(所有操作都基于这两个常量)
ENCRYPTED_FILE = "credentials.enc"
TEMP_PLAIN_FILE = "credentials.tmp.json"

def generate_key():
    """首次运行时生成加密密钥,务必妥善保存!"""
    key = Fernet.generate_key()
    with open("secret.key", "wb") as key_file:
        key_file.write(key)
    print("密钥已生成并保存到secret.key,千万不要弄丢或泄露!")

def load_key():
    """加载已保存的密钥"""
    if not os.path.exists("secret.key"):
        raise ValueError("密钥文件secret.key不存在,请先运行generate_key()生成密钥")
    return open("secret.key", "rb").read()

def encrypt_file(input_path, output_path, key):
    """加密指定文件"""
    fernet = Fernet(key)
    with open(input_path, "rb") as f:
        raw_data = f.read()
    encrypted_data = fernet.encrypt(raw_data)
    with open(output_path, "wb") as f:
        f.write(encrypted_data)

def decrypt_file(input_path, output_path, key):
    """解密指定文件"""
    fernet = Fernet(key)
    with open(input_path, "rb") as f:
        encrypted_data = f.read()
    decrypted_data = fernet.decrypt(encrypted_data)
    with open(output_path, "wb") as f:
        f.write(decrypted_data)

def get_credentials():
    """获取凭证的标准化流程:解密→读取→重新加密→清理临时文件"""
    key = load_key()
    credentials = None

    try:
        # 1. 解密加密文件到临时明文文件
        decrypt_file(ENCRYPTED_FILE, TEMP_PLAIN_FILE, key)
        
        # 2. 读取并解析凭证数据
        # 注意:你的原始文件是两个独立JSON对象,先转换成合法JSON数组格式
        with open(TEMP_PLAIN_FILE, "r", encoding="utf-8") as f:
            raw_content = f.read().strip()
            # 把 "} {" 替换成 "}, {" 再包裹成数组,变成合法JSON
            valid_json_content = f"[{raw_content.replace('} {', '}, {')}]"
            credentials = json.loads(valid_json_content)

        # 3. 重新加密临时文件,覆盖原加密文件
        encrypt_file(TEMP_PLAIN_FILE, ENCRYPTED_FILE, key)
    finally:
        # 无论成功失败,都强制删除临时明文文件,避免泄露
        if os.path.exists(TEMP_PLAIN_FILE):
            os.remove(TEMP_PLAIN_FILE)
    
    return credentials

# 初始化流程:首次运行时加密原始凭证文件
if __name__ == "__main__":
    # 假设你的原始明文凭证文件叫credentials.json
    ORIGINAL_PLAIN_FILE = "credentials.json"
    if not os.path.exists("secret.key"):
        generate_key()
    key = load_key()
    encrypt_file(ORIGINAL_PLAIN_FILE, ENCRYPTED_FILE, key)
    print(f"原始凭证文件已加密为 {ENCRYPTED_FILE}")
关键细节说明
  • 命名一致性保障:通过ENCRYPTED_FILE和TEMP_PLAIN_FILE两个常量锁定文件名,所有加密解密操作都围绕这两个固定名称进行,彻底杜绝命名混乱。
  • JSON格式修复:你的原始凭证文件是两个独立的JSON对象({"customer1":...} {"customer2":...}),这不是合法的JSON格式,我在代码里加了格式转换逻辑,把它变成合法的JSON数组,这样才能正常解析。后续建议直接保存合法JSON格式的文件,减少额外处理。
  • 安全防护:用finally块确保临时明文文件一定会被删除,哪怕读取或加密过程中出错,也不会留下明文泄露的风险。
  • 密钥管理:密钥文件secret.key是解密的核心,务必妥善保管,丢失的话就无法恢复凭证数据了!
调用示例

当你需要获取凭证时,直接调用get_credentials()即可:

creds = get_credentials()
print(creds[0]["customer1"]["pwd"])  # 输出 mypwd
print(creds[1]["customer2"]["api_key"])  # 输出 mykey

内容的提问来源于stack exchange,提问作者Souvik Ray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:21:45