Python中如何加密CSV和JSON文件 限制仅自身程序可读取
实现方案说明
你需要的效果完全可以通过对称加密算法实现,最常用的方案是AES加密,你只需要把加密密钥固定在你的Python代码中,加密后的json、csv文件只有使用对应密钥才能解密读取,其他程序拿到加密文件也无法解析出明文内容。
具体实现步骤
- 先安装加密依赖库:
pip install pycryptodome - 对原有读写逻辑做一层封装:写文件时先把json/csv的明文内容加密后再写入磁盘;读文件时先把磁盘中的加密内容解密后,再按原来的json/csv逻辑解析即可
- 密钥需要保存在你的Python代码中,注意不要泄露代码内的密钥,一旦密钥泄露其他人也可以解密文件
示例代码
通用加密解密工具函数
from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytes import json import csv # 硬编码在你的代码里的32位密钥(AES-256加密需要32字节密钥,可运行一次get_random_bytes(32)生成后固定写死) SECRET_KEY = b'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' def encrypt_data(plain_text: str) -> bytes: iv = get_random_bytes(AES.block_size) cipher = AES.new(SECRET_KEY, AES.MODE_CBC, iv) padded_data = pad(plain_text.encode('utf-8'), AES.block_size) encrypted_data = cipher.encrypt(padded_data) # iv不需要保密,和加密内容拼在一起存储即可 return iv + encrypted_data def decrypt_data(encrypted_data: bytes) -> str: iv = encrypted_data[:AES.block_size] actual_encrypted_data = encrypted_data[AES.block_size:] cipher = AES.new(SECRET_KEY, AES.MODE_CBC, iv) decrypted_padded_data = cipher.decrypt(actual_encrypted_data) plain_text = unpad(decrypted_padded_data, AES.block_size).decode('utf-8') return plain_text
加密写入json文件示例
# 原有业务数据 data = {"name": "test", "age": 20} # 转成json明文 plain_json = json.dumps(data) # 加密后写入磁盘 encrypted_content = encrypt_data(plain_json) with open("data.json", "wb") as f: f.write(encrypted_content)
解密读取json文件示例
with open("data.json", "rb") as f: encrypted_content = f.read() # 解密得到明文json plain_json = decrypt_data(encrypted_content) data = json.loads(plain_json) # 后续可以正常使用data变量
csv文件的操作逻辑完全一致,写文件时把csv明文内容加密后存储,读文件时解密后再按csv格式解析即可。
注意事项
- 密钥只需要生成一次,生成后固定写在代码里即可,不要每次运行程序都重新生成密钥,否则之前加密的文件会无法解密
- 如果需要更高的安全性,可以把密钥存在系统密钥链中,不要直接硬编码在代码里,避免代码泄露导致密钥泄露
- 加密后的文件是二进制格式,无法直接用文本编辑器打开查看明文,只有用你的代码加对应密钥才能解密
- 不要弄丢密钥,一旦密钥丢失你自己也无法读取原有加密文件的内容
内容的提问来源于stack exchange,提问作者georgehere
相关产品推荐
相关产品推荐

