【发布时间】:2023-03-18 18:23:01
【问题描述】:
我正在尝试在 Android (Java) 中复制 Python HMAC-SHA256 等效项。 Python 表示如下所示,并带有正确的输出:
Python
print (hmac.new(key = binascii.unhexlify("0123465789"),msg = binascii.unhexlify("ABCDEF"),digestmod=hashlib.sha256).hexdigest()).upper()
Output
5B5EE08A20DDD645A31384E51AC581A4551E9BE5AC8BF7E690A5527F2B9372CB
但是,我无法使用以下代码在 Java 中获得相同的输出:
Java
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec("0123465789".getBytes("UTF-8"), "HmacSHA256");
sha256_HMAC.init(secretKey);
byte[] hash = sha256_HMAC.doFinal("ABCDEF".getBytes("UTF-8"));
String check = (new String(Hex.encodeHex(hash))).toUpperCase();
System.out.println(check);
Output
46F9FD56BDAE29A803BAD5BC668CB78DA4C54A51E6C031FB3BC2C42855047213
我相当肯定我的问题是无法编写与 Python 等效的 Java 代码:
key = binascii.unhexlify("0123465789")
&
msg = binascii.unhexlify("ABCDEF")
这是因为当我不对 Python 中的十六进制字符串输入执行 binascii.unhexlify 时,我会为两种方法呈现相同的结果。但是,Python HMAC-SHA256 需要 binascii.unhexlify 操作。
我做了很多研究,甚至尝试导入 Python 用来在 Java 中执行 binascii.unhexlify 的方法,但我仍然无法产生相同的结果。在解决此问题时,任何帮助和/或建议将不胜感激。谁能帮帮我?
【问题讨论】:
-
您在 python 代码中对密钥和消息进行十六进制解码,因此在 Java 中,您显然需要使用代表密钥和消息的
"0123465789".getBytes("UTF-8")而不是 hex-decode strings。 -
Python HMAC-SHA1 vs Java HMAC-SHA1 different results 的可能重复项,对于重复项可能不是一个好的选择,但问题的要点是相同的 - 如果在一种语言中使用十六进制,则在适当的地方使用另一种语言的十六进制编码也是。
-
@user3801679 你找到解决方案了吗?
标签: java android python hmac sha256