You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:47:39