python:无效的base64编码字符串:数据字符数(5)不能比4的倍数多1

fay*_*rao 7 python decode

输出以下错误:

异常值:
无效的 base64 编码字符串:数据字符数 (5) 不能比 4 的倍数多 1
异常位置:D:\Program Files\Python\lib\base64.py in b64decode, line 87"

我像这样输入python:

key = hashlib.md5("exit_care".encode("ascii")).hexdigest().encode("ascii")
key_64 = base64.urlsafe_b64decode(key)
cipher_suite = Fernet(key_64)  
Run Code Online (Sandbox Code Playgroud)

Syl*_*lex 5

假设您使用的是由密码学 python 包提供的 Fernet 类,您需要将您的密钥编码为 base64,而不是在传入之前对其进行解码。编码转换为指定的形式,解码转换为指定的形式。您目前正在做的是转换exit_care为 ascii(不是必需的),计算 md5 哈希,获得十六进制表示,然后再次将其转换为 ascii。然后,当您使用base64.urlsafe_b64decode(key). 这是目前的故障点。可能您的意思是改为使用base64.urlsafe_b64encode(key)将其转换为使用 Fernet 所需的 base64。

这是可能的,你可能需要填充它以32个字节为Fernet文档建议https://cryptography.io/en/latest/fernet/#cryptography.fernet.Fernet

参数: key (bytes) – URL 安全 base64 编码的 32 字节密钥。这必须保密。拥有此密钥的任何人都可以创建和阅读消息。

这是因为 MD5 会产生一个 128 位的值,它被编码为一个 22 个字符的 base64 字符串(实际上是 24,因为 python 自动填充到 4 的倍数)。请参阅/sf/answers/930740891/了解为什么会出现这种情况。查看 Fernet 实现,他们检查 64 位编码字符串的长度以查看其长度是否为 32,如果不是,则会出错。如果需要,您可以使用右键填充=,或者您可以使用下面描述的密钥生成/密钥拉伸算法。

我建议使用与此处https://cryptography.io/en/latest/fernet/#using-passwords-with-fernet的密码学 python 包的 Fernet 文档中的设置类似的设置进行密钥拉伸。页面中的代码粘贴在下面,用 HKDF 替换 PBKDF2HMAC,因为前者需要盐,并且只要您不将密码存储在生产数据库中,就可能在这种情况下过度杀伤。

>>> import base64
>>> import os
>>> from cryptography.fernet import Fernet
>>> from cryptography.hazmat.backends import default_backend
>>> from cryptography.hazmat.primitives import hashes
>>> from cryptography.hazmat.primitives.kdf.hkdf import HKDF
>>> password = b"password"
>>> hkdf = HKDF(
...     algorithm=hashes.SHA256(),  # You can swap this out for hashes.MD5()
...     length=32,
...     salt=None,    # You may be able to remove this line but I'm unable to test
...     info=None,    # You may also be able to remove this line
...     backend=default_backend()
... )
>>> key = base64.urlsafe_b64encode(hkdf.derive(password))
>>> f = Fernet(key)
>>> token = f.encrypt(b"Secret message!")
>>> token
b'...'
>>> f.decrypt(token)  # Process the key in the exact same manner to decode an encoded message
b'Secret message!'
Run Code Online (Sandbox Code Playgroud)


小智 5

在我的虚拟环境中卸载 Django==3.1.7 并安装 Django==3.0.6 后,我发生了这个错误。清除浏览器中的所有 cookie 并刷新页面对我有用。