【问题标题】:Android (Java) method equivalent to Python HMAC-SHA256 in HexAndroid(Java)方法等效于十六进制的 Python HMAC-SHA256
【发布时间】: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


【解决方案1】:

这可能会有所帮助...我已创建代码以在 Java 和 Python 中创建哈希并将代码上传到 Github。

这两个程序在 base64 中创建相同的哈希码。

回购网址:https://github.com/AsadShakeel/HMAC-Java-Python-Hashing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2017-08-02
    • 2014-10-05
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多