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

        ↓

本地配置 / 授权文件加密

结合:

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

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

相关推荐
大白同学4212 小时前
初始Qt——了解Qt背景
开发语言·qt
万山寒2 小时前
python依赖包导出离线安装到没有外网的服务器
服务器·开发语言·python
特立独行的猫a3 小时前
我用 Rust + Tauri 2 复刻了 N_m3u8DL-CLI:一个 m3u8 多线程下载器
开发语言·后端·rust·m3u8·视频下载器·m3u8dl-cli
程序员雷欧3 小时前
LongAdder
开发语言·python
月光船幽幽3 小时前
分层阈值规避归藏协议过度重置
人工智能·python
鱼子星_3 小时前
【C++】反向迭代器:反向迭代器的底层认识与模拟实现
开发语言·c++·笔记·stl
名字还没想好☜3 小时前
Java 用 MethodHandle 替代反射:调用性能实测、invokeExact 的坑与缓存
java·开发语言·缓存·反射·methodhandle
SMF19193 小时前
【Linux】完美解决缩略图工具gm调用java.io.FileNotFoundException: gm问题
java·开发语言·python
㳺三才人子3 小时前
初探 Data Analysis - Matplotlib
python·plotly·pandas·matplotlib