Python调用PSD2接口时SHA256哈希与JS结果不一致求解决
解决Python对接PSD2哈希流程与JS结果不一致的问题
我正在对接PSD2的API端点,要求的核心处理逻辑是基于原始消息生成SHA256哈希,再对哈希结果做Base64编码。用对方提供的示例参数验证时,JS校验工具返回的预期输出是:pfHPQFso5E7SlQfg9kSVhZuod4k9KnFFEtFs472L5WI=,但我的Python代码得到的结果却和JS页面把输入类型设为text时的结果一致,完全不符合预期。
我的原代码
import base64 import hashlib # get_input返回输入的base64字节数据 result = base64.b64encode(hashlib.sha256(get_input()).digest())
示例输入内容(Base64编码的JSON)
ewogICJpbnN0cnVjdGVkQW1vdW50IiA6IHsKICAgICJjdXJyZW5jeSIgOiAiRVVSIiwKICAgICJhbW91bnQiIDogIjE2LjAwIgogIH0sCiAgImRlYnRvckFjY291bnQiIDogewogICAgImliYW4iIDogIkVTNTE0MDAwMDAwMTA1MDAwMDAwMDAwMSIsCiAgICAiY3VycmVuY3kiIDogIkVVUiIKICB9LAogICJjcmVkaXRvck5hbWUiIDogIkNyZWQuIE5hbWUiLAogICJjcmVkaXRvckFjY291bnQiIDogewogICAgImliYW4iIDogIkVTNjYyMTAwMDQxODQwMTIzNDU2Nzg5MSIsCiAgICAiY3VycmVuY3kiIDogIkVVUiIKICB9LAogICJjcmVkaXRvckFkZHJlc3MiIDogewogICAgInN0cmVldCIgOiAiRWplbXBsbyBkZSBjYWxsZSIsCiAgICAiYnVpbGRpbmdOdW1iZXIiIDogIjE1IiwKICAgICJjaXR5IiA6ICJDb3Jkb2JhIiwKICAgICJwb3N0YWxDb2RlIiA6ICIxNDEwMCIsCiAgICAiY291bnRyeSIgOiAiRVMiCiAgfSwKICAicmVtaXR0YW5jZUluZm9ybWF0aW9uVW5zdHJ1Y3R1cmVkIiA6ICJQYWdvIiwKICAiY2hhcmdlQmVhcmVyIiA6ICJDUkVEIgp9
问题原因
问题出在输入的处理逻辑上:
- 我的原代码直接对Base64编码后的字节做哈希,相当于把Base64字符串本身当成了消息内容,这和JS工具设置为text时的逻辑一致,但PSD2要求的是基于原始消息的字节(即Base64解码后的内容)计算哈希。
- JS工具返回预期结果时,是先将Base64输入解码为原始JSON字节,再执行哈希和Base64编码的流程。
解决方案
调整代码,先将Base64输入解码为原始消息字节,再进行哈希计算,最后对哈希结果做Base64编码:
import base64 import hashlib # 1. 先将Base64编码的输入解码为原始消息字节 raw_message = base64.b64decode(get_input()) # 2. 生成SHA256哈希 hash_bytes = hashlib.sha256(raw_message).digest() # 3. 对哈希结果做Base64编码,并转换为字符串(去掉字节前缀b'') result = base64.b64encode(hash_bytes).decode() print(result)
验证结果
运行这段代码后,就能得到预期的输出:pfHPQFso5E7SlQfg9kSVhZuod4k9KnFFEtFs472L5WI=
内容的提问来源于stack exchange,提问作者NoiK
相关产品推荐
相关产品推荐

