Unicode 对象必须在哈希错误之前进行编码

2024-04-17

处理类似问题的问题:SO 1 https://stackoverflow.com/questions/7585307/typeerror-unicode-objects-must-be-encoded-before-hashing, SO 2 https://stackoverflow.com/questions/13265439/python-3-3-unicode-objects-must-be-encoded-before-hashing, SO 3 https://stackoverflow.com/questions/37640868/python-3-4-error-unicode-objects-must-be-encoded-before-hashing.

我已经尝试过他们的答案,将几乎任何字符串编码为utf-8, but hmac仍然告诉我对我的 unicode 字符进行编码。最大的问题是我什至无法识别出有问题的变量;打印输出告诉我它们是strings or bytes;对于前者,我附上.encode(),但这并没有帮助。

我正在尝试查询 GDAX API 并且我也使用 API 页面上给出的代码 https://docs.gdax.com/?python#generating-an-api-key。由于是为 Python2.7 编写的,我认为可能存在编码等问题,但这对我来说没有意义。

My code:

class CoinbaseExchangeAuth(AuthBase):
    def __init__(self, api_key, secret_key, passphrase):
        self.api_key = api_key.encode()
        self.secret_key = secret_key.encode()
        self.passphrase = passphrase.encode()

    def __call__(self, request):
        timestamp = str(time.time())
        message = timestamp + request.method + request.path_url + (request.body or '')
        hmac_key = base64.b64decode(self.secret_key)
    #print(hmac_key, type(hmac_key))
    #print(message, type(message))
    signature = hmac.new(hmac_key, message, hashlib.sha256)

    signature_b64 = signature.digest().encode('base64').rstrip('\n')


    request.headers.update({
        'CB-ACCESS-SIGN': signature_b64,
        'CB-ACCESS-TIMESTAMP': timestamp,
        'CB-ACCESS-KEY': self.api_key,
        'CB-ACCESS-PASSPHRASE': self.passphrase,
        'Content-Type': 'application/json'
    })
    return request

错误:

File "F:\git\knowhere\Private\bitex-crawler\gdax_client\gdaxex\api.py", line 47, in __call__
signature = hmac.new(hmac_key, message, hashlib.sha256)
File "C:\Users\nls\Anaconda3\lib\hmac.py", line 144, in new
return HMAC(key, msg, digestmod)
File "C:\Users\nls\Anaconda3\lib\hmac.py", line 84, in __init__
self.update(msg)
File "C:\Users\nls\Anaconda3\lib\hmac.py", line 93, in update
self.inner.update(msg)
TypeError: Unicode-objects must be encoded before hashing

当我输入时检查我提供给我的对象hmac.new()打电话,它告诉我我有一个str对象和一个bytes object.

print(type(hmac_key)) # <bytes>
print(type(message))  # <str>

当然,我认为我也需要对那个傻瓜进行编码:

signature = hmac.new(hmac_key, message.encode(), hashlib.sha256)

这导致了这一行的错误:

signature_b64 = signature.digest().encode('base64').rstrip('\n')

namely:

File "F:/git/knowhere/Private/bitex-crawler/gdax_client/client.py",
[..]
File "F:\git\knowhere\Private\bitex-crawler\gdax_client\gdaxex\api.py", line 123, in _query
r = api_query(url, json=req, auth=auth)
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\api.py", line 67, in get
return request('get', url, params=params, **kwargs)
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\api.py", line 53, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\sessions.py", line 454, in request
prep = self.prepare_request(req)
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\sessions.py", line 388, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\models.py", line 297, in prepare
self.prepare_auth(auth, url)
File "C:\Users\nls\Anaconda3\lib\site-packages\requests\models.py", line 490, in prepare_auth
r = auth(self)
File "F:\git\knowhere\Private\bitex-crawler\gdax_client\gdaxex\api.py", line 49, in __call__
signature_b64 = signature.digest().encode('base64').rstrip('\n')
AttributeError: 'bytes' object has no attribute 'encode'

..所以我不能有未编码的unicode对象,但我以后也不能有字节?我到底该如何解决这个问题?感谢对此的任何帮助,因为我非常困惑。


“参数 msg 可以是 hashlib 支持的任何类型。” https://docs.python.org/3/library/hashlib.html#module-hashlib.

“注意:不支持将字符串对象输入,因为哈希值作用于字节,而不是字符。” https://docs.python.org/3/library/hashlib.html#module-hashlib.

因此,您的消息必须是类型bytes. Use .encode()在消息上,它将为您提供字节对象。

注意:这仅对 python 3 是必需的!

要将摘要编码为 Base64,请使用Base64 库 https://docs.python.org/2/library/base64.html.

import base64
signature_b64 = base64.b64encode(signature.digest())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unicode 对象必须在哈希错误之前进行编码 的相关文章

随机推荐

  • Python 类中的属性初始化/声明:将它们放在哪里?

    我想知道在 Python 中初始化对象属性的最佳实践是什么 在类的主体中还是在 init 功能 i e class A object foo None vs class A object def init self self foo Non
  • 在 postgresql 中生成自动 ID

    用户表 ID Name 1 usr1 2 usr2 3 usr3 上表中 ID为主键 我的要求是在将数据插入表中时 我只想指定 名字像INSERT INTO user VALUES usr4 执行查询后 有没有办法自动为 usr4 创建ID
  • ACRA 行号不正确

    我使用 android proguard ACRA 谁能告诉我为什么我收到的崩溃报告的行号不正确 行号显然指向错误的陈述 我无法知道崩溃的确切行号 因此无法修复用户报告的错误 这真的很烦人 谢谢 PS 我使用的是我发布的版本对应的映射文件
  • 如何设置 QBrush 的颜色动画

    我想要动画颜色QBrush 更多详情请看下面的代码 这是我的 h 文件 class Cell public QObject public QGraphicsRectItem Q OBJECT Q PROPERTY QBrush brush
  • Jquery 动态更改链接扩展名

    我在很多页面都设置了链接 例如 ul li a href someurl somefile html Some file a li li a href someurl somefile1 html Some file1 a li li a
  • CMake+Xcode:应用程序存档失败,具体取决于同一解决方案中的库。在 BUILD_TREE 而不是 Xcode/DerivedData 中构建 Archive?

    几周前 我们移植了代码库以使用 CMake 进行构建管理 我们现在意识到 当我们试图做到这一点时 存在一个重大问题Archive依赖于同一 Xcode 解决方案中构建的一个 或多个 库的应用程序 链接器失败 因为它找不到所依赖的库 并且该库
  • 以编程方式更改小部件的渐变背景

    我正在努力实现的目标 int colors new int colorDark colorLight GradientDrawable gd new GradientDrawable TOP BOTTOM colors remoteView
  • IIS 7.5 405 不允许从 StaticFileModule 进行 PUT 方法

    我将第 3 方 xml 编辑器集成到我们的 Web 应用程序中 并且保存函数直接对 Web 服务器上的文件执行 HTTP PUT 操作系统是使用 IIS 7 5 的 Windows Server 2008 R2 我们安装了 Web API
  • 使用 API 蓝图记录查询参数

    我正在尝试在 API 蓝图中记录查询参数 但我不完全确定我是否正确完成了操作 该资源如下所示 DELETE http baasar apiary mock com user appId userId 该请求将停用用户 而以下请求将删除用户对
  • 中可以有 吗?

    故事如下 我正在使用 SWFObject 将 Flash 对象插入到我的页面中 嵌入吃掉了我的span 所以 我为此失去了所有 CSS 我正在考虑将所有 CSS 移至父级 这样当 Flash 出现时我就不会丢失 CSS 样式 我尝试过使用s
  • CSS :focus-within 选择器,用于具有 iframe 子元素的元素

    我有一个这样的场景 container background yellow padding 40px container focus within background red iframe background white div cla
  • 异步作业出错

    我正在尝试创建一个不会阻止请求的异步任务 用户发出请求 任务将启动 控制器将呈现 作业正在运行 这是为了避免请求被阻止等待任务完成 任务完成后 它将执行 onComplete 并对该任务的结果执行某些操作 例如调用将向用户发送邮件的服务 E
  • 循环遍历 Silverlight DataGrid 中的行

    我有一种感觉 我在这里遗漏了一些明显的东西 但我找不到迭代 DataGrids DataGridRow 集合的方法 我有一个网格 其中包含我的班级集的集合的项目源 我试图迭代这些行并突出显示满足特定条件的任何行 但我一生都看不到如何实现 您
  • 在循环语句中生成 MVC3 RadioButton 列表

    我的一位同事创建了一个模型 如下所示 Model Serializable public class ModifyCollegeListModel public List
  • HTTP 错误 999:请求被拒绝

    我正在尝试使用 BeautifulSoup 从 LinkedIn 抓取一些网页 但不断收到错误 HTTP 错误 999 请求被拒绝 有没有办法避免这个错误 如果您查看我的代码 我尝试过 Mechanize 和 URLLIB2 两者都给了我相
  • 如何在 Visual Studio 2019 的 CMakeLists.txt 中启用 clang-tidy?

    视觉工作室 2019文档 https learn microsoft com en us visualstudio code quality clang tidy view只谈改变CMakeSettings json启用clang tidy
  • 为什么标题重复了?

    我正在获取当前正在播放的歌曲 捕获标题和艺术家 并将其存储在解析中 由于某种原因 当歌曲播放时 程序会添加 4 首左右相同的标题 艺术家 相反 我只想要一个 我该如何解决 在解析数据浏览器中看到的我的对象 https i stack img
  • 通过 PageController 路由除现有控制器之外的所有请求 (Zend Framework)

    对于新的 CMS 我开发了一个页面模块 它允许我管理网站的树结构 每个页面都可以通过 url 访问http www example com pageslug http www example com pageslug 其中pageslug
  • 亚马逊 Linux 上的 mysql - MySQL 守护进程无法启动

    我尝试重新启动 EC2 实例并sudo service httpd restart 但我仍然收到这样的消息 ec2 user ip sudo service mysqld start MySQL Daemon failed to start
  • Unicode 对象必须在哈希错误之前进行编码

    处理类似问题的问题 SO 1 https stackoverflow com questions 7585307 typeerror unicode objects must be encoded before hashing SO 2 h