如何从YAML文件读取cryptography.fernet生成的加密密钥为字符串?
YAML存储Fernet密钥的格式问题解决
问题场景
用tkinter搭建UI,通过cryptography.fernet加密密码并存入YAML文件,同时把加密密钥也存储进去。但密钥被自动加上!!binary前缀,用yaml.load()读取后变成二进制格式,不是想要的原始Base64字符串。
现有credentials.yml内容
encryption_key: !!binary | Rkl5ZVFTQnZhNG1LcVhsSU1LV3FUZzNETGVRcWx0VTQyMzFyRDJlTWR4UT0= username: Jack encrypted_password: gAAAAABlXhuUZimgsD1eN7gLZpfzvxKc4Bz9fIPmVhWvwGoKkaUiSWOSf7gkFJBM8XRU-kgn37kKH3KC2XTz-CHLVX2PFerckQ==
测试代码
import yaml from cryptography.fernet import Fernet with open("credentials.yml", 'r') as file: yaml_data = yaml.load(file) print(yaml_data['encryption_key'])
当前输出与期望
- 当前输出:
b'FIyeQSBva4mKqXlIMKWqTg3DLeQqltU4231rD2eMdxQ=' - 期望输出:
Rkl5ZVFTQnZhNG1LcVhsSU1LV3FUZzNETGVRcWx0VTQyMzFyRDJlTWR4UT0=
两种解决方案
方案1:存储时直接保存原始Base64字符串
Fernet生成的密钥本质是Base64编码的字节串,存储前先把它转成字符串,这样写入YAML时就不会被识别为二进制,也就不会出现!!binary前缀。
示例代码:
import yaml from cryptography.fernet import Fernet # 生成密钥并转为UTF-8字符串 encryption_key = Fernet.generate_key().decode('utf-8') # 初始化加密器(注意要转回字节串) fernet = Fernet(encryption_key.encode('utf-8')) # 加密密码并转字符串存储 encrypted_password = fernet.encrypt(b"your_raw_password").decode('utf-8') # 组装数据写入YAML credentials = { "encryption_key": encryption_key, "username": "Jack", "encrypted_password": encrypted_password } with open("credentials.yml", 'w') as f: yaml.dump(credentials, f)
此时YAML里的encryption_key就是纯字符串,读取时直接拿到的就是你想要的格式。
方案2:读取现有二进制密钥转成原始字符串
如果已经有带!!binary的YAML文件,只需把读取到的二进制数据重新Base64编码并转成字符串即可。
示例代码:
import yaml import base64 from cryptography.fernet import Fernet with open("credentials.yml", 'r') as file: yaml_data = yaml.load(file) # 将二进制密钥转回原始Base64字符串 original_key = base64.b64encode(yaml_data['encryption_key']).decode('utf-8') print(original_key) # 输出期望的原始密钥字符串
原理:!!binary是把YAML里的Base64字符串解码成二进制,反过来用base64.b64encode把二进制再编码回Base64格式,转成字符串就是原来的内容。
内容的提问来源于stack exchange,提问作者arezab
相关产品推荐
相关产品推荐

