Python 使用 cryptography 实现数据加密与解密

1. 背景

在实际软件开发中,经常需要保护一些敏感数据,例如:

  • 用户配置
  • 用户认证信息
  • 软件授权信息
  • 相机参数
  • 设备序列号
  • 通信密钥
  • 数据库连接信息

如果直接使用 JSON、TXT 或 INI 文件保存:

复制代码
username=admin
password=123456
camera_ip=192.168.1.100

用户可以直接查看和修改,存在安全风险。

对于工业软件、视觉检测软件、设备控制软件而言,配置文件安全非常重要。

Python 提供了 cryptography 加密库,可以方便地实现数据加密存储。

本文介绍基于:

Fernet 对称加密算法

实现本地数据加密与解密。


2. 安装 cryptography

使用 pip 安装:

bash 复制代码
pip install cryptography

检查安装版本:

python 复制代码
import cryptography

print(cryptography.__version__)

3. 加密算法选择

cryptography 支持多种密码算法:

算法 类型 特点
Fernet 对称加密 简单、安全、推荐
AES 对称加密 工业应用常用
RSA 非对称加密 用于密钥交换
HMAC 完整性验证 防止数据篡改

对于桌面软件:

  • 工业视觉软件
  • AOI检测软件
  • 测量软件
  • 运动控制软件

推荐:

复制代码
Fernet

Fernet 内部使用:

复制代码
AES-128-CBC
+
HMAC-SHA256

同时提供:

  • 数据加密
  • 数据解密
  • 数据完整性验证

4. 生成密钥

Fernet 加密需要一个密钥。

python 复制代码
from cryptography.fernet import Fernet


key = Fernet.generate_key()

print(key)


with open(
    "secret.key",
    "wb"
) as f:
    f.write(key)

生成:

复制代码
secret.key

文件内容:

复制代码
加密密钥

注意:

该文件非常重要。

丢失:

无法恢复加密数据。

泄露:

加密失效。


5. 加载密钥

python 复制代码
from cryptography.fernet import Fernet


def load_key():

    with open(
        "secret.key",
        "rb"
    ) as f:

        return f.read()



key = load_key()


cipher = Fernet(key)

此时:

复制代码
cipher

就是加密工具。


6. 字符串加密

例如:

python 复制代码
username = "admin"

password = "123456"


data = (
    username
    +
    ":"
    +
    password
)


encrypted = cipher.encrypt(
    data.encode("utf-8")
)


print(encrypted)

输出:

复制代码
b'gAAAAABxxxxxxxxxxxx'

保存后:

用户无法直接读取真实内容。


7. 数据解密

python 复制代码
decrypt_data = cipher.decrypt(
    encrypted
)


result = decrypt_data.decode(
    "utf-8"
)


print(result)

输出:

复制代码
admin:123456

8. 封装加密管理类

实际项目建议封装:

python 复制代码
from cryptography.fernet import Fernet



class CryptoManager:


    def __init__(self,key_file):

        self.key_file = key_file

        self.key = self.load_key()

        self.cipher = Fernet(
            self.key
        )



    def load_key(self):

        with open(
            self.key_file,
            "rb"
        ) as f:

            return f.read()



    def encrypt(self,data):

        if isinstance(
            data,
            str
        ):

            data = data.encode(
                "utf-8"
            )


        return self.cipher.encrypt(
            data
        )



    def decrypt(self,data):

        result = self.cipher.decrypt(
            data
        )


        return result.decode(
            "utf-8"
        )

9. 使用示例

初始化:

python 复制代码
crypto = CryptoManager(
    "secret.key"
)

加密:

python 复制代码
text = "Camera_IP=192.168.1.10"


encrypt_text = crypto.encrypt(
    text
)


print(encrypt_text)

解密:

python 复制代码
result = crypto.decrypt(
    encrypt_text
)


print(result)

输出:

复制代码
Camera_IP=192.168.1.10

10. 加密 JSON 配置文件

工业软件通常保存:

json 复制代码
{
    "camera_ip":"192.168.1.100",
    "device_id":"CAM001",
    "license":"ABCDEFG",
    "exposure":5000
}

读取:

python 复制代码
import json


with open(
    "config.json",
    "r",
    encoding="utf-8"
) as f:

    config=json.load(f)

转换:

python 复制代码
text=json.dumps(
    config,
    ensure_ascii=False
)

加密:

python 复制代码
encrypted = crypto.encrypt(
    text
)

保存:

python 复制代码
with open(
    "config.dat",
    "wb"
) as f:

    f.write(encrypted)

最终文件:

复制代码
config.dat

内容类似:

复制代码
gAAAAABlxxxxxxxx

用户无法直接修改参数。


11. 读取加密配置

python 复制代码
with open(
    "config.dat",
    "rb"
) as f:

    data=f.read()



text = crypto.decrypt(
    data
)



config=json.loads(
    text
)


print(config)

恢复:

json 复制代码
{
    "camera_ip":"192.168.1.100",
    "device_id":"CAM001",
    "license":"ABCDEFG"
}

12. 软件授权应用

授权文件:

json 复制代码
{
    "machine_id":"PC001",
    "expire":"2027-01-01",
    "level":"PRO"
}

软件启动流程:

复制代码
启动软件

    ↓

读取 license.dat

    ↓

解密

    ↓

验证机器码

    ↓

验证有效期

    ↓

加载功能模块

应用:

  • 商业软件授权
  • 工业设备授权
  • 功能模块限制

13. 密钥安全设计

错误方式

不要:

python 复制代码
KEY=b"xxxxxxxx"

原因:

  • 反编译可以找到
  • 破解程序后可以解密

推荐方式

软件目录:

复制代码
Application

 ├── app.exe
 ├── config.dat
 └── license.dat

系统安全区域:

复制代码
secret.key

或者:

  • Windows Credential Manager
  • TPM安全芯片
  • USB授权狗
  • 硬件安全模块

14. 密码不能直接加密保存

错误:

复制代码
用户密码

    ↓

AES/Fernet

    ↓

保存

正确:

复制代码
用户密码

    ↓

Hash算法

    ↓

保存

推荐:

  • Argon2
  • bcrypt
  • scrypt

15. 工业软件典型架构

复制代码
                 软件启动

                     |

               ConfigManager

                     |

        +------------+------------+

        |                         |

    config.dat              license.dat

        |                         |

     decrypt                decrypt

        |                         |

    相机参数               授权验证

        |

        ↓

  CameraManager

        |

        ↓

    开始采集

16. 总结

cryptography 提供了一套可靠的 Python 数据保护方案。

在工业视觉软件、检测软件、设备控制软件中,可以用于:

✅ 配置文件加密

✅ 软件授权保护

✅ 设备参数保护

✅ 通信密钥保存

✅ 用户数据保护

推荐方案:

复制代码
cryptography

        ↓

     Fernet

        ↓

 AES + HMAC

        ↓

本地配置 / 授权文件加密

结合:

  • 对象生命周期管理
  • 单例资源管理
  • 配置管理
  • 授权验证

可以有效提升工业软件的安全性和稳定性。

相关推荐
默_笙1 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003961 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技1 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时1 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++
奇思妙想聪明勤奋的小羊1 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1231 天前
2026年第38周GitHub趋势周报
python·科技·github