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
↓
本地配置 / 授权文件加密
结合:
- 对象生命周期管理
- 单例资源管理
- 配置管理
- 授权验证
可以有效提升工业软件的安全性和稳定性。