欢迎光临
我们一直在努力

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

1. 背景

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

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

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

username=admin
password=123456
camera_ip=192.168.1.100

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

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

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

本文介绍基于:

Fernet 对称加密算法

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


2. 安装 cryptography

使用 pip 安装:

pip install cryptography

检查安装版本:

import cryptography

print(cryptography.__version__)


3. 加密算法选择

cryptography 支持多种密码算法:

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

对于桌面软件:

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

推荐:

Fernet

Fernet 内部使用:

AES-128-CBC
+
HMAC-SHA256

同时提供:

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

4. 生成密钥

Fernet 加密需要一个密钥。

from cryptography.fernet import Fernet

key = Fernet.generate_key()

print(key)

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

生成:

secret.key

文件内容:

加密密钥

注意:

该文件非常重要。

丢失:

无法恢复加密数据。

泄露:

加密失效。


5. 加载密钥

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. 字符串加密

例如:

username = "admin"

password = "123456"

data = (
username
+
":"
+
password
)

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

print(encrypted)

输出:

b'gAAAAABxxxxxxxxxxxx'

保存后:

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


7. 数据解密

decrypt_data = cipher.decrypt(
encrypted
)

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

print(result)

输出:

admin:123456


8. 封装加密管理类

实际项目建议封装:

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. 使用示例

初始化:

crypto = CryptoManager(
"secret.key"
)

加密:

text = "Camera_IP=192.168.1.10"

encrypt_text = crypto.encrypt(
text
)

print(encrypt_text)

解密:

result = crypto.decrypt(
encrypt_text
)

print(result)

输出:

Camera_IP=192.168.1.10


10. 加密 JSON 配置文件

工业软件通常保存:

{
"camera_ip":"192.168.1.100",
"device_id":"CAM001",
"license":"ABCDEFG",
"exposure":5000
}

读取:

import json

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

config=json.load(f)

转换:

text=json.dumps(
config,
ensure_ascii=False
)

加密:

encrypted = crypto.encrypt(
text
)

保存:

with open(
"config.dat",
"wb"
) as f:

f.write(encrypted)

最终文件:

config.dat

内容类似:

gAAAAABlxxxxxxxx

用户无法直接修改参数。


11. 读取加密配置

with open(
"config.dat",
"rb"
) as f:

data=f.read()

text = crypto.decrypt(
data
)

config=json.loads(
text
)

print(config)

恢复:

{
"camera_ip":"192.168.1.100",
"device_id":"CAM001",
"license":"ABCDEFG"
}


12. 软件授权应用

授权文件:

{
"machine_id":"PC001",
"expire":"2027-01-01",
"level":"PRO"
}

软件启动流程:

启动软件

读取 license.dat

解密

验证机器码

验证有效期

加载功能模块

应用:

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

13. 密钥安全设计

错误方式

不要:

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

本地配置 / 授权文件加密

结合:

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

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

赞(0)
未经允许不得转载:171主机测评 » Python 使用 cryptography 实现数据加密与解密
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址