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

2024-05-06

输出以下错误:

异常值:
Base64 编码字符串无效:数据字符数 (5) 不能多于 4 的倍数 1
异常位置:b64decode 中的 D:\Program Files\Python\lib\base64.py,第 87 行 ”

我这样输入 python :

key = hashlib.md5("exit_care".encode("ascii")).hexdigest().encode("ascii")
key_64 = base64.urlsafe_b64decode(key)
cipher_suite = Fernet(key_64)  

假设您正在使用加密 python 包提供的 Fernet 类,您需要encode您的密钥作为 base64 在传入之前不会对其进行解码。编码转换为指定的形式,解码从指定的形式转换。您当前正在做的事情是转换exit_care转换为 ascii(不必要),计算 md5 哈希值,获取十六进制表示形式,然后再次将其转换为 ascii。然后,当您使用时,您的程序会尝试将十六进制->ascii md5哈希解释为base64编码的字符串base64.urlsafe_b64decode(key)。这是目前的失败点。可能你想使用base64.urlsafe_b64encode(key)而是将其转换为使用 Fernet 所需的 base64。

这是可能的您可能需要将其填充到 32 字节正如 Fernet 文档所示https://cryptography.io/en/latest/fernet/#cryptography.fernet.Fernet https://cryptography.io/en/latest/fernet/#cryptography.fernet.Fernet

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

这是因为 MD5 将生成一个 128 位值,该值被编码为 22 个字符的 base64 字符串(实际上是 24,因为 python 自动填充为 4 的倍数)。看https://stackoverflow.com/a/13296298/6269138 https://stackoverflow.com/a/13296298/6269138至于为什么会这样。查看 Fernet 实现,他们检查 64 位编码字符串的长度以查看其长度是否为 32,如果不是,则会出错。你可以右垫=如果需要,或者您可以使用下面描述的密钥生成/密钥拉伸算法。

我建议使用与此处找到的密码学 python 包的 Fernet 文档类似的设置https://cryptography.io/en/latest/fernet/#using-passwords-with-fernet https://cryptography.io/en/latest/fernet/#using-passwords-with-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!'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python:无效的base64编码字符串:数据字符数(5)不能多于4的倍数1 的相关文章

随机推荐

  • 删除 ChildEventListener

    我正在使用 FirebasechildEventListener被添加 N 次到Node从数据库获取数据 现在我正在尝试删除childEventListener它似乎不起作用 我得到了重复的数据 query FirebaseDatabase
  • 如何将堆栈跟踪发送到 log4j?

    假设您捕获了一个异常 并在标准输出 例如控制台 上得到以下内容 如果您执行e printStackTrace java io FileNotFoundException so txt at java io FileInputStream
  • 如何修复实例上的错误:未定义的变量 B?

    我想编译此 Verilog 代码 但在实例中出现错误B模块中的MultiP module error 1 Undefined variable B error 2 near Adder1 syntax error unexpected ID
  • NSIS - 在命令行安装期间打印提示

    我正在使用 NSIS 为 Windows 制作安装程序 并且有许多用户可以使用命令行指定的自定义安装选项 例如 installer exe IDPATH c Program Files Adobe Adobe InDesign CS5 S
  • 在Application中显示Android application.apk的创建日期

    我正在开发一个android应用程序 我想显示版本 apk和日期现在我可以使用显示应用程序的应用程序版本PackageInfo现在我想显示应用程序创建的日期或 apk创建日期 对于新读者 public static String getAp
  • WPF 图片库

    我将驱动一个需要向用户呈现图像组的触摸屏应用程序 不是网络应用程序 我们的愿望是呈现具有页面前进 后退功能的 3x3 图像网格 他们可以选择一些 我将只展示这些图像 我没看到ListView完全符合我的要求 尽管 WPF 足够大 我很可能错
  • 具有通用存储库、依赖项注入和 SoC 的 EF6 Code First

    经过大量阅读和尝试之后Entity Framework最新稳定版本 6 1 1 我读到了很多关于是否使用存储库的矛盾EF6 or EF一般来说 因为它是DbContext已经提供了一个存储库并且DbSet the UoW 盒子外面 让我首先
  • Angular JSON 与 JSONP $promise

    如果我从我的controller js进行这个JSON调用 scope userInvestors userInvestors query UserID scope user uid function userInvestors conso
  • 列出 chrome 注册的 Service Worker

    有没有办法列出所有注册服务人员的浏览器 假设我已经注册 安装了一些服务人员 我可以通过js获取文件名数组列表吗 显然我找到了两种适合我的方法 对于 Chrome 一种是使用快捷命令 chrome serviceworker internal
  • MVVM 路由和中继命令

    两者有什么区别路由命令 http msdn microsoft com en us library system windows input routedcommand aspx and 中继命令 http msdn microsoft c
  • 使用 Cloudformation SAM 的 AWS::Serverless::Api 资源策略

    最近AWS宣布 是否可以将资源策略附加到通过 Cloudformation 使用 SAM 创建的 AWS Serverless Api 我还没有机会尝试这个 但我假设您可以像使用 S3 存储桶策略一样使用它 对你来说最棘手的部分是抓住api
  • 编译时映射和逆映射值

    有人可以推荐一种更优雅的方法来实现这些编译时常量吗 template
  • 计算 HBase 表中列族的记录数

    我正在寻找一个 HBase shell 命令来计算指定列族中的记录数 我知道我可以运行 echo scan table name hbase shell grep column family name wc l 然而 这将比标准计数命令运行
  • 如何在 angularFire 0.5.0 和最新的 ng-grid 之间创建 3 路数据绑定?

    angularFire bind 方法可以在这里找到 http angularfire com flatdoc html http angularfire com flatdoc html最新的 ng grid 可以在这里找到 http a
  • 加快写入多个图像 TIFF 的速度?

    我正在尝试将图像堆栈写入 TIFF 文件 图像大小为 256 256 像素 每个堆栈包含 1000 张图像 编写其中一个文件大约需要 4 分钟 所以我的代码很可能有问题 这就是我正在做的 void Tiff WriterSplit floa
  • 如何从 Symfony2 中的数据库加载配置设置?

    我当前在 config yml 文件中有许多设置 展望未来 我希望能够开发一个界面 管理员可以在其中更新这些设置 因此我希望能够通过数据库管理这些设置 我如何能够将这些设置从数据库加载到 Symfony2 中 以及在何时何地加载它们 Che
  • 如何给MySQL表添加主键?

    这是我尝试过的 但失败了 alter table goods add column id int 10 unsigned primary AUTO INCREMENT 有人有提示吗 添加列后 您可以随时添加主键 ALTER TABLE go
  • 如何在 Android 模拟器中模拟真实的外部 SD(更新:可移动存储)卡

    我尝试模拟外部 SD 卡 就像在真实设备中一样 在真实设备中 除非使用新的 存储访问框架 API 21 和 22 否则外部 SD 卡不可写入 当我添加带有文件或大小的 SD 卡时 我总是得到一个可写的 SD 卡 这对于真实的设备来说是不正确
  • 值得学习的优秀 Zend Framework 示例应用程序 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • python:无效的base64编码字符串:数据字符数(5)不能多于4的倍数1

    输出以下错误 异常值 Base64 编码字符串无效 数据字符数 5 不能多于 4 的倍数 1异常位置 b64decode 中的 D Program Files Python lib base64 py 第 87 行 我这样输入 python