文章目录

配方数据的加密存储与解密读取

发布于 2026-03-29 23:13:14 · 浏览 8 次 · 评论 0 条

配方数据的加密存储与解密读取

电气自动化系统中,配方数据通常包含关键工艺参数,如温度设定、压力阈值、电机转速等。若这些数据以明文形式存储,极易被篡改或窃取,导致产品质量波动或技术泄露。本指南提供一套基于工业电脑(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 进行数据交互。以下流程展示了数据从用户输入到最终存储的安全路径。

graph TD A["用户输入配方参数"] --> B{操作类型?} B -- 保存 --> C["调用加密模块"] C --> D["生成密文数据"] D --> E["写入本地存储/数据库"] E --> F["结束保存流程"] B -- 加载 --> G["读取密文文件"] G --> H["调用解密模块"] H --> I["还原明文参数"] I --> J["发送至 PLC 寄存器"] J --> K["结束加载流程"]

上述流程中,加密与解密模块必须封装为独立函数或类,避免密钥逻辑泄露。PLC 仅接收解密后的明文参数,不接触密钥文件。

数据存储对比

明文存储与加密存储在安全性与可读性上存在显著差异。下表展示了两种方式的直接对比,帮助理解加密的必要性。

特性 明文存储 (JSON/CSV) 加密存储 (二进制)
文件内容 可直接阅读的参数值 无意义的乱码字符
篡改难度 极低,记事本即可修改 极高,无密钥无法还原
读取速度 快,无需计算 稍慢,需解密运算
安全性 低,无保护 高,依赖密钥管理
适用场景 测试环境、非关键参数 生产环境、关键工艺

密钥安全管理

密钥的安全性直接决定整个系统的安全性。若密钥丢失,加密数据将无法恢复;若密钥泄露,加密形同虚设。

分离 存储位置。将 secret.key 文件存放在与加密数据不同的磁盘分区,例如数据在 D:\Data,密钥在 E:\Keys

设置 文件权限。右键 点击 密钥文件,选择 属性进入 安全 选项卡,移除 所有用户组,仅保留当前运行账户的 读取 权限。

备份 密钥文件。将密钥拷贝至加密的 U 盘或安全服务器,禁止 通过邮件或即时通讯工具传输密钥。

轮换 密钥策略。每半年 生成 新密钥,重新加密 所有历史配方数据,并 销毁 旧密钥文件。

限制 访问代码。在软件代码中 硬编码 密钥路径,禁止 允许用户通过界面选择密钥文件位置,防止加载恶意密钥。

异常处理与日志

系统必须具备完善的异常处理机制,防止因解密失败导致生产线停机。

捕获 解密异常。在解密函数外围 包裹 try...except 结构,捕获 InvalidToken 等特定错误。

记录 错误日志。当解密失败时,写入 时间戳与错误代码到 error_log.txt禁止 在日志中记录密钥信息或明文数据。

触发 报警信号。若连续三次解密失败,输出 数字信号至 PLC 报警寄存器,提示 操作员检查系统完整性。

保留 默认配方。在系统内部 固化 一套安全默认参数,当加密数据无法读取时,自动切换 至默认模式,维持基本运行。

隔离 故障模块。若加密组件损坏,禁用 配方加载功能,允许 手动模式运行,防止错误参数下发至设备。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文