配方数据的加密存储与解密读取
电气自动化系统中,配方数据通常包含关键工艺参数,如温度设定、压力阈值、电机转速等。若这些数据以明文形式存储,极易被篡改或窃取,导致产品质量波动或技术泄露。本指南提供一套基于工业电脑(IPC)环境的加密存储与解密读取方案,确保数据在静止状态下的安全性。
准备工作
安装 Python 运行环境。访问 Python 官网下载最新版本,勾选 Add Python to PATH 选项,点击 Install Now 完成安装。
打开 命令行工具。按下 Win + R 键,输入 cmd,按下 回车 键。
安装 加密库。在命令行中 输入 以下命令并 按下 回车:
pip install cryptography
创建 项目文件夹。在磁盘根目录 新建 文件夹 RecipeSecurity,用于存放所有脚本与密钥文件。
生成加密密钥
密钥是加密与解密的核心,必须单独保存,严禁与加密数据放在同一位置。
创建 密钥生成脚本。在 RecipeSecurity 文件夹内 新建 文本文件,重命名 为 generate_key.py。
输入 以下代码内容:
from cryptography.fernet import Fernet
def write_key():
key = Fernet.generate_key()
with open("secret.key", "wb") as key_file:
key_file.write(key)
if __name__ == "__main__":
write_key()
print("密钥已生成:secret.key")
保存 文件。按下 Ctrl + S 保存 修改,关闭 编辑器。
运行 脚本。在命令行中 切换 到 RecipeSecurity 目录,输入 python generate_key.py 并 按下 回车。
确认 文件生成。检查文件夹内是否出现 secret.key 文件,该文件包含二进制密钥数据,禁止 直接打开查看。
实现数据加密存储
加密过程将明文配方数据转换为不可读的密文,防止未经授权的访问。
创建 加密脚本。在 RecipeSecurity 文件夹内 新建 文件 encrypt_recipe.py。
输入 以下代码内容:
from cryptography.fernet import Fernet
import json
def load_key():
return open("secret.key", "rb").read()
def encrypt_data(data_dict, filename):
key = load_key()
f = Fernet(key)
# 将字典转换为 JSON 字符串
json_data = json.dumps(data_dict).encode('utf-8')
# 加密
encrypted = f.encrypt(json_data)
# 写入文件
with open(filename, "wb") as file:
file.write(encrypted)
print(f"数据已加密并保存至:{filename}")
if __name__ == "__main__":
# 示例配方数据
recipe = {
"ID": "P001",
"Temperature": 150.5,
"Pressure": 0.8,
"Speed": 1200
}
encrypt_data(recipe, "recipe_encrypted.dat")
保存 文件。按下 Ctrl + S 保存 修改。
运行 脚本。在命令行中 输入 python encrypt_recipe.py 并 按下 回车。
验证 结果。检查文件夹内是否生成 recipe_encrypted.dat 文件,该文件内容为乱码,无法直接读取。
实现数据解密读取
解密过程仅由授权程序执行,将密文还原为可用的工艺参数。
创建 解密脚本。在 RecipeSecurity 文件夹内 新建 文件 decrypt_recipe.py。
输入 以下代码内容:
from cryptography.fernet import Fernet
import json
def load_key():
return open("secret.key", "rb").read()
def decrypt_data(filename):
key = load_key()
f = Fernet(key)
# 读取密文
with open(filename, "rb") as file:
encrypted_data = file.read()
# 解密
decrypted = f.decrypt(encrypted_data)
# 转换回字典
data_dict = json.loads(decrypted.decode('utf-8'))
return data_dict
if __name__ == "__main__":
try:
recipe = decrypt_data("recipe_encrypted.dat")
print("解密成功,配方参数如下:")
for k, v in recipe.items():
print(f"{k}: {v}")
except Exception as e:
print(f"解密失败:{e}")
保存 文件。按下 Ctrl + S 保存 修改。
运行 脚本。在命令行中 输入 python decrypt_recipe.py 并 按下 回车。
查看 输出。命令行应显示原始的配方参数值,证明解密成功。
系统集成流程
在自动化系统中,加密模块通常位于 HMI 或上位机软件中,与 PLC 进行数据交互。以下流程展示了数据从用户输入到最终存储的安全路径。
上述流程中,加密与解密模块必须封装为独立函数或类,避免密钥逻辑泄露。PLC 仅接收解密后的明文参数,不接触密钥文件。
数据存储对比
明文存储与加密存储在安全性与可读性上存在显著差异。下表展示了两种方式的直接对比,帮助理解加密的必要性。
| 特性 | 明文存储 (JSON/CSV) | 加密存储 (二进制) |
|---|---|---|
| 文件内容 | 可直接阅读的参数值 | 无意义的乱码字符 |
| 篡改难度 | 极低,记事本即可修改 | 极高,无密钥无法还原 |
| 读取速度 | 快,无需计算 | 稍慢,需解密运算 |
| 安全性 | 低,无保护 | 高,依赖密钥管理 |
| 适用场景 | 测试环境、非关键参数 | 生产环境、关键工艺 |
密钥安全管理
密钥的安全性直接决定整个系统的安全性。若密钥丢失,加密数据将无法恢复;若密钥泄露,加密形同虚设。
分离 存储位置。将 secret.key 文件存放在与加密数据不同的磁盘分区,例如数据在 D:\Data,密钥在 E:\Keys。
设置 文件权限。右键 点击 密钥文件,选择 属性,进入 安全 选项卡,移除 所有用户组,仅保留当前运行账户的 读取 权限。
备份 密钥文件。将密钥拷贝至加密的 U 盘或安全服务器,禁止 通过邮件或即时通讯工具传输密钥。
轮换 密钥策略。每半年 生成 新密钥,重新加密 所有历史配方数据,并 销毁 旧密钥文件。
限制 访问代码。在软件代码中 硬编码 密钥路径,禁止 允许用户通过界面选择密钥文件位置,防止加载恶意密钥。
异常处理与日志
系统必须具备完善的异常处理机制,防止因解密失败导致生产线停机。
捕获 解密异常。在解密函数外围 包裹 try...except 结构,捕获 InvalidToken 等特定错误。
记录 错误日志。当解密失败时,写入 时间戳与错误代码到 error_log.txt,禁止 在日志中记录密钥信息或明文数据。
触发 报警信号。若连续三次解密失败,输出 数字信号至 PLC 报警寄存器,提示 操作员检查系统完整性。
保留 默认配方。在系统内部 固化 一套安全默认参数,当加密数据无法读取时,自动切换 至默认模式,维持基本运行。
隔离 故障模块。若加密组件损坏,禁用 配方加载功能,允许 手动模式运行,防止错误参数下发至设备。

暂无评论,快来抢沙发吧!