【问题标题】:Java and Python generate different Hmac-SHA256 outputJava 和 Python 生成不同的 Hmac-SHA256 输出
【发布时间】:2016-04-24 18:13:07
【问题描述】:

我正在尝试在 Python 中生成与我的 Java 模板中相同的 Hmac-SHA256 签名。但是 Python 脚本生成的输出不同。我找不到我的错误。谁能帮帮我?

Java

public class Main {
    public static void main(String[] args) {
        String paramString = "teststring";
        calculateSignature(hash(paramString));
    }

    private static byte[] hash(String paramString)
    {
        MessageDigest localMessageDigest = MessageDigest.getInstance("SHA-256");
        localMessageDigest.update(paramString.getBytes("UTF-8"));
        byte[] paramByte = localMessageDigest.digest();
        System.out.println("Hash: " + DatatypeConverter.printBase64Binary(paramByte));
        return paramByte;
    }

    public static void calculateSignature(byte[] paramArrayOfByte)
    {
        String Algor = "HmacSHA256";
        Mac localMac = Mac.getInstance(Algor);
        byte [] key = "secretkey".getBytes();
        localMac.init(new SecretKeySpec(key, Algor));
        paramArrayOfByte = localMac.doFinal(paramArrayOfByte);
        System.out.println("Signature: " + DatatypeConverter.printBase64Binary(paramArrayOfByte));
    }
}

哈希:PIcn4BmkK0RGZ6WHtgASUb7K2ruza/7YCHqSwYiC0RE=

签名:X8V4RA7qaoVGz5K2l61gAXNPuLkAI7NZ9/9d7WnblbA=

Python

# -*- coding: utf-8 -*-
import hashlib
import base64
import hmac

secretkey = 'secretkey'
stringToSign = "teststring"

def hash(paramstring):
    x = base64.b64encode(hashlib.sha256(paramstring).digest())
    print('Hash: ' + x)
    return x

def calculate_signature(hashvalue):
    x = base64.b64encode(hmac.new(secretkey, hashvalue, hashlib.sha256).digest())
    print('Signature: ' + x)

calculate_signature(hash(stringToSign))

哈希:PIcn4BmkK0RGZ6WHtgASUb7K2ruza/7YCHqSwYiC0RE=

签名:NE8RtuFsOtafWrwDdlzILMgqCDm2huJ9A3IO6iy44Jc=

【问题讨论】:

    标签: java python hmac


    【解决方案1】:

    问题是在 python 代码中你返回 base64 编码但在 java 中你只是将它打印为 base64 编码但没有返回。

    试试:

    private static byte[] hash(String paramString)
    {
        MessageDigest localMessageDigest = MessageDigest.getInstance("SHA-256");
        localMessageDigest.update(paramString.getBytes("UTF-8"));
        byte[] paramByte = localMessageDigest.digest();
        String base64Binary = DatatypeConverter.printBase64Binary(paramByte);
        System.out.println("Hash: " + base64Binary);
        return base64Binary.getBytes();
    }
    

    或者修改python代码为:

    def hash(paramstring):
        x = hashlib.sha256(paramstring).digest()
        return x
    

    【讨论】:

    • 没错。 java中的Hmac模块需要一个字节编码的输入。我还必须将 python 代码调整为 java 代码。 python代码有什么问题?
    • 为什么需要调整python代码?通过这些更改,python 和 java 都给出了相同的结果。
    • 我必须编写 python 代码才能与现有系统进行通信。 java代码适用于系统,是我的模板。
    • 签名:X8V4RA7qaoVGz5K2l61gAXNPuLkAI7NZ9/9d7WnblbA=
    • 因此您可以更改 python 代码作为答案。我更新了。
    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多