python - 无法在 python 和 javascript 中获得相同的 sha256 哈希
问题描述
我按照步骤调用 PSD2 端点,对消息进行 base64 编码,然后获取 SHA256 以从中获取哈希并获取哈希的 base64。我使用示例的相同值来检查我是否做得对。他们还提供了一个带有 js 库的网站来检查结果。
输入:
ewogICJpbnN0cnVjdGVkQW1vdW50IiA6IHsKICAgICJjdXJyZW5jeSIgOiAiRVVSIiwKICAgICJhbW91bnQiIDogIjE2LjAwIgogIH0sCiAgImRlYnRvckFjY291bnQiIDogewogICAgImliYW4iIDogIkVTNTE0MDAwMDAwMTA1MDAwMDAwMDAwMSIsCiAgICAiY3VycmVuY3kiIDogIkVVUiIKICB9LAogICJjcmVkaXRvck5hbWUiIDogIkNyZWQuIE5hbWUiLAogICJjcmVkaXRvckFjY291bnQiIDogewogICAgImliYW4iIDogIkVTNjYyMTAwMDQxODQwMTIzNDU2Nzg5MSIsCiAgICAiY3VycmVuY3kiIDogIkVVUiIKICB9LAogICJjcmVkaXRvckFkZHJlc3MiIDogewogICAgInN0cmVldCIgOiAiRWplbXBsbyBkZSBjYWxsZSIsCiAgICAiYnVpbGRpbmdOdW1iZXIiIDogIjE1IiwKICAgICJjaXR5IiA6ICJDb3Jkb2JhIiwKICAgICJwb3N0YWxDb2RlIiA6ICIxNDEwMCIsCiAgICAiY291bnRyeSIgOiAiRVMiCiAgfSwKICAicmVtaXR0YW5jZUluZm9ybWF0aW9uVW5zdHJ1Y3R1cmVkIiA6ICJQYWdvIiwKICAiY2hhcmdlQmVhcmVyIiA6ICJDUkVEIgp9
预期输出:
pfHPQFso5E7SlQfg9kSVhZuod4k9KnFFEtFs472L5WI=
我在做什么:
import base64
import hashlib
# get_input returns the input base64 in bytes
result = base64.b64encode(hashlib.sha256(get_input()).digest())
在这种情况下,结果是:
b'JRtx3taNOfx00oj2xuyoAxocxfJnL/wEXLYf9+t9jCk='
而不是预期的结果。
此结果与 JS 页面将输入类型从 base64 更改为 text 的结果相同,因此我假设输入是正确的。但是对于 hashlib,没有输入类型选项。所以我的问题是:我必须做什么才能在 python 中使用该输入获得预期的输出?
解决方案
该网站正在从 base64 解码输入字符串,对其进行哈希处理,然后将哈希编码为 base64。
>>> s = 'ewogICJpbnN0cnVjdGVkQW1vdW50IiA6IHsKICAgICJjdXJyZW5jeSIgOiAiRVVSIiwKICAgICJhbW91bnQiIDogIjE2LjAwIgogIH0sCiAgImRlYnRvckFjY291bnQiIDogewogICAgImliYW4iIDogIkVTNTE0MDAwMDAwMTA1MDAwMDAwMDAwMSIsCiAgICAiY3VycmVuY3kiIDogIkVVUiIKICB9LAogICJjcmVkaXRvck5hbWUiIDogIkNyZWQuIE5hbWUiLAogICJjcmVkaXRvckFjY291bnQiIDogewogICAgImliYW4iIDogIkVTNjYyMTAwMDQxODQwMTIzNDU2Nzg5MSIsCiAgICAiY3VycmVuY3kiIDogIkVVUiIKICB9LAogICJjcmVkaXRvckFkZHJlc3MiIDogewogICAgInN0cmVldCIgOiAiRWplbXBsbyBkZSBjYWxsZSIsCiAgICAiYnVpbGRpbmdOdW1iZXIiIDogIjE1IiwKICAgICJjaXR5IiA6ICJDb3Jkb2JhIiwKICAgICJwb3N0YWxDb2RlIiA6ICIxNDEwMCIsCiAgICAiY291bnRyeSIgOiAiRVMiCiAgfSwKICAicmVtaXR0YW5jZUluZm9ybWF0aW9uVW5zdHJ1Y3R1cmVkIiA6ICJQYWdvIiwKICAiY2hhcmdlQmVhcmVyIiA6ICJDUkVEIgp9'
>>> decoded = base64.b64decode(s)
>>> hash_ = hashlib.sha256(decoded)
>>> r = base64.b64encode(hash_.digest())
>>> r.decode()
'pfHPQFso5E7SlQfg9kSVhZuod4k9KnFFEtFs472L5WI='
推荐阅读
- django - 嵌套 select_related 从各种模型 django ORM 中获取数据
- node.js - nodeJS 在启动时自动发送 dns 查询
- excel - 添加一个“。” 当用户输入 3 个字符时到文本框
- django - 如何将环境变量传递给 Azure 部署?
- makefile - 草图的 arduino IDE 构建步骤是什么?
- python - 具有两个循环功能的无限循环
- vis.js - 如何修复 JavaScript 代码上的“未捕获的类型错误:无法读取未定义的属性“范围”?
- sql - 使用 case 语句从单列中获取两列
- flutter - 如何在下拉菜单中添加验证器
- c# - 正则表达式用逗号和等号解析字符串