Java中用于哈希的相当于Python的是什么?

3

我在Java文档中看到以下代码(它需要secret_keydata作为输入):

javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA1")
mac.init(new javax.crypto.spec.SecretKeySpec(secret_key.getBytes(), "HmacSHA1"))
byte[] hexBytes = new org.apache.commons.codec.binary.Hex().encode(mac.doFinal(data.getBytes()))
String signature = new String(hexBytes, "UTF-8")

在进行了一些在线的研究之后,我编写了相应的Python代码:

decodedKey = secret_key.decode("hex")
hmac_val = hmac.new(decodedKey, data.encode('UTF-8'), hashlib.sha1)
signature = hmac_val.digest().encode('base64')

但是,当我在header中进行post请求时,使用此签名值时出现以下错误:

ValueError: 无效的头部值 'XXXXXXXXXX'

我的Python等价代码正确吗?如果有人能解释一下,那就太好了!

编辑

Java

public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
        String secret_key = "c84766ca4a3ce52c3602bbf02ad1f7";
        String data = "some data";
        javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA1");
        mac.init(new javax.crypto.spec.SecretKeySpec(secret_key.getBytes(), "HmacSHA1"));
        byte[] hexBytes = new org.apache.commons.codec.binary.Hex().encode(mac.doFinal(data.getBytes()));
        String signature = new String(hexBytes, "UTF-8");
        System.out.println("signature : "+signature);
 }

输出

signature : 2b565c0476eed0f350ddb3a2852a4cab91281bdc

Python :

In [1]: import hmac

In [2]: import hashlib

In [3]: secret_key = "c84766ca4a3ce52c3602bbf02ad1f7"

In [4]: data = "some data"

In [5]: decodedKey = secret_key.decode("hex")

In [6]: hmac_val = hmac.new(decodedKey, data.encode('UTF-8'), hashlib.sha1)

In [7]: signature = hmac_val.digest().encode('base64')

In [8]: signature
Out[8]: '3qE5SqSdvBEJcy8mSF+srqNXCd4=\n'

In [9]:

5
翻译内容:犯错是人性的,宽恕则是神性的。 - NoobEditor
请发布这两个程序的实际输出结果。 - chrylis -cautiouslyoptimistic-
我的第一个猜测是,你要散列的数据在两个平台上表示不一致。请给它们提供相同的预生成字节序列。 - chrylis -cautiouslyoptimistic-
@chrylis:已添加编辑,请查看。 - NoobEditor
3个回答

1

0

为了获得相同的结果,算法必须相等,直到位级别(字节序等)。通常,您可以使用调试器(pdb、jdb)逐步执行算法中的每个操作,并查看差异发生的位置。请参见此线程以获取javax.crypto的源代码https://dev59.com/4HXYa4cB1Zd3GeqP7pDa(据我所知,Java始终是大端序)。 - ralf htp
当我的编程语言具备相同的功能时,为什么要在程序中使用其他语言呢? - NoobEditor

0

1
输出结果为ec0e4e884b0056d817efb56ab5920509,不正确,而且为什么不编辑现有的答案而是发布一个新的呢? - NoobEditor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接