文件加密解密命名不一致问题及凭证文件加密解密流程求助
嘿,我明白你现在遇到的问题了——在处理凭证文件的加密解密循环时,文件名乱掉确实挺头疼的。毕竟每次解密再加密,要是命名没管好,很容易出现多个版本的文件,或者找不到正确的加密文件。我来给你梳理个清晰的解决方案,还补全了可运行的代码示例。
核心思路:固定文件命名规则
首先得给加密文件和解密临时文件设定固定、明确的命名,彻底避免混乱。比如我们约定:
- 加密后的凭证文件固定叫
credentials.enc - 解密时生成的临时明文文件固定叫
credentials.tmp.json
每次操作严格遵循这个流程:
- 解密
credentials.enc到临时明文文件 - 读取临时文件里的凭证数据
- 完成操作后,重新加密临时文件回
credentials.enc - 立刻删除临时明文文件(防止凭证泄露)
完整代码实现(基于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
相关产品推荐
相关产品推荐

