Python报错:无法访问str类型的bytes成员,求字符串转字节方法
解决Python字符串转字节及Fernet密钥格式问题
核心错误原因
Python 字符串类型没有 .bytes 成员属性,你用 master_pwd.bytes 转换字节必然报错。正确的字符串转字节方式是调用 str.encode(encoding) 方法,通常指定 utf-8 编码。
另外,原代码中直接将加载的key与密码字节拼接的方式不符合Fernet的密钥要求:Fernet要求密钥必须是URL-safe的base64编码32字节数据,直接拼接会导致密钥格式/长度不合法,后续初始化Fernet对象会失败。
修正步骤及代码
- 替换字符串转字节的错误写法
- 使用密码派生函数(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
相关产品推荐
相关产品推荐

