输出以下错误:
例外值: 无效的be 64编码字符串:数据字符(5)的数目不能超过4的倍数。 异常位置: D:\Program \Python\lib\ line 64.py在b64decode中,第87行“
我输入python如下:
key = hashlib.md5("exit_care".encode("ascii")).hexdigest().encode("ascii")
key_64 = base64.urlsafe_b64decode(key)
cipher_suite = Fernet(key_64) 发布于 2019-03-11 16:17:59
假设您使用的是加密python包提供的Fernet类,您需要在传入密钥之前将密钥编码为,而不是对其进行解码。编码转换为指定的表单,解码转换自指定的表单。当前所做的工作是将exit_care转换为ascii (不需要),计算md5哈希,获取一个十六进制表示,并再次将其转换为ascii。然后,当您使用md5时,您的程序试图将该十六进制->ascii base64.urlsafe_b64decode(key)哈希解释为一个hash 64编码的字符串。这是目前的失败点。您可能意味着使用base64.urlsafe_b64encode(key),而不是将其转换为使用Fernet所需的base64。
您可能需要将压缩为32字节,正如Fernet文档所建议的https://cryptography.io/en/latest/fernet/#cryptography.fernet.Fernet
参数:键(字节)-URL安全的byte 64编码的32字节密钥.这必须保密。任何拥有此键的人都能够创建和读取消息。
这是因为MD5将产生一个128位的值,该值被编码为一个22个字符的base64字符串(实际上是24,因为python自动地将pad变为4的倍数)。关于为什么会出现这种情况,请参见https://stackoverflow.com/a/13296298/6269138。查看Fernet实现,他们检查64位编码字符串的长度,以确定其长度是否为32,如果不是,则会出错。如果您愿意,可以使用= ,或者可以使用下面描述的密钥生成/键拉伸算法。
我建议使用类似于Fernet文档中的加密python包的设置,在这里可以找到用于键拉伸的https://cryptography.io/en/latest/fernet/#using-passwords-with-fernet。页面中的代码被粘贴到下面,用HKDF替换掉PBKDF2HMAC,因为前者需要一个salt,而且在这种情况下,只要您不将密码存储在生产数据库中,就可能会过度使用。
>>> 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!'发布于 2021-04-12 11:36:02
在卸载Django==3.1.7并在我的虚拟环境中安装Django==3.0.6之后,发生了这个错误。清除浏览器中的所有cookie并刷新页面对我有效。
发布于 2020-10-22 04:57:52
python -m pip install --upgrade pip
pip install django --upgrade它为我工作,我创建了一个新的虚拟环境并安装了所有新的升级包,如果您使用实时大项目,它有一些约束像这样的django版本只需要,那么您可以检查其他答案,我正在等待知识的替代。
如果需要,还可以升级特定的django版本。pip安装--升级django==1.6.5
https://stackoverflow.com/questions/55105045
复制相似问题