跳到主要内容

加密敏感数据 Encrypting sensitive data

为了防止数据泄露,敏感数据如令牌、密钥、信用卡号码和其他“机密信息”必须以加密形式存储(数据库、文件、客户端存储)。

Flet 提供了一些实用方法,可使用对称算法对敏感文本数据进行加密和解密(其中加密和解密使用相同的密钥)。它们使用了 cryptography 包中的 Fernet 实现,该实现是 AES 128 加上一些额外的强化,并使用 PBKDF2 从用户口令派生加密密钥。

密钥

加密密钥(也称为密码或口令)是一个由用户配置的任意类似密码的字符串,用于加密和解密数据。加密算法使用密钥来“派生”加密密钥(32 字节)。

危险

不要将任何机密信息嵌入到源代码中,以避免意外暴露给公众!

您可以通过环境变量向应用程序提供一个密钥:

import os
secret_key = os.getenv("MY_APP_SECRET_KEY")

在运行应用程序之前,在命令行中设置密钥:

$ export MY_APP_SECRET_KEY="<secret>"
备注

尽管通过环境变量传递机密信息是开发人员和服务提供商常用的做法,但在某些环境中,它不能完全防止机密信息泄露。您可以使用其他机制将机密信息注入到应用程序中,例如挂载机密文件或使用保险库服务。

加密数据

使用 encrypt() 方法加密字符串:

import os
from flet.security import encrypt, decrypt

secret_key = os.getenv("MY_APP_SECRET_KEY")
plain_text = "这是一条秘密消息!"
encrypted_data = encrypt(plain_text, secret_key)

encrypted_data 是一个 URL 安全的 base64 编码的字符串。

encrypt 只接受字符串作为输入,因此任何对象在加密之前必须序列化为 JSON、XML 或其他文本格式。

解密数据

使用 decrypt() 方法解密数据:

import os
from flet.security import encrypt, decrypt

secret_key = os.getenv("MY_APP_SECRET_KEY")
encrypted_data = "601llp2zpPp4QjBWe2cOwGdBQUFBQUJqTTFJbmgyWU5jblVp..."
plain_text = decrypt(encrypted_data, secret_key)
print(plain_text)