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

Python报错:无法访问str类型的bytes成员,求字符串转字节方法

解决Python字符串转字节及Fernet密钥格式问题

核心错误原因

Python 字符串类型没有 .bytes 成员属性,你用 master_pwd.bytes 转换字节必然报错。正确的字符串转字节方式是调用 str.encode(encoding) 方法,通常指定 utf-8 编码。

另外,原代码中直接将加载的key与密码字节拼接的方式不符合Fernet的密钥要求:Fernet要求密钥必须是URL-safe的base64编码32字节数据,直接拼接会导致密钥格式/长度不合法,后续初始化Fernet对象会失败。

修正步骤及代码

  1. 替换字符串转字节的错误写法
  2. 使用密码派生函数(PBKDF2HMAC)从密码和盐生成合法的Fernet密钥(原代码中write_key生成的文件应作为盐使用)

修正后的完整代码:

from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import base64

def write_salt():
    # 生成盐(原write_key改为生成盐,用于密钥派生)
    salt = Fernet.generate_key()  # 用Fernet的生成方法生成符合要求的随机盐
    with open("salt.key", "wb") as salt_file:
        salt_file.write(salt)

def load_salt():
    file = open("salt.key", "rb") 
    salt = file.read()
    file.close()
    return salt

# 首次运行需要调用write_salt()生成盐文件,之后注释掉
# write_salt()

master_pwd = input("What is the master password? ")
master_pwd_bytes = master_pwd.encode('utf-8')  # 正确将字符串转为字节
salt = load_salt()

# 通过PBKDF2HMAC派生符合Fernet要求的密钥
kdf = PBKDF2HMAC(
    algorithm=hashes.SHA256(),
    length=32,
    salt=salt,
    iterations=100000,
)
key = base64.urlsafe_b64encode(kdf.derive(master_pwd_bytes))
fer = Fernet(key)

def view():
    with open('passwords.txt', 'r') as f:
        for line in f.readlines():
            data = line.rstrip()
            user, passw = data.split("|")
            # 添加解密逻辑
            decrypted_pwd = fer.decrypt(passw.encode('utf-8')).decode('utf-8')
            print("User:", user, "| Password:", decrypted_pwd)

def add():
    name = input('Account name: ')
    pwd = input('Password: ')
    encrypted_pwd = fer.encrypt(pwd.encode('utf-8'))  # 加密密码
    with open('passwords.txt', 'a') as f:
        f.write(name + "|" + encrypted_pwd.decode('utf-8') + "\n")

while True:
    mode = input("Would you like to add a new password or view existing ones (view, add), press q to quit? ").lower()
    if mode == "q":
        break

    if mode == "view":
        view()
    elif mode == "add":
        add()
    else:
        print("Invalid mode.")
        continue

关键说明

  • 首次运行需取消注释write_salt()生成盐文件,之后无需重复生成
  • 示例中已完善加密/解密逻辑,保证密码存储安全
  • PBKDF2HMAC的迭代次数可根据安全性需求调整,建议不低于100000次

内容的提问来源于stack exchange,提问作者Daniel Lex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:40:19