2016-04-23 271 views
2

我想在Python中生成與我的Java模板相同的Hmac-SHA256簽名。但Python腳本生成不同的輸出。我找不到我的錯誤。誰能幫我?Java和Python生成不同的Hmac-SHA256輸出

爪哇

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 =

回答

1

的問題是在你返回base64編碼,但在Java中,你只是打印出來作爲base64編碼,但沒有返回Python代碼。

嘗試:

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 
+0

這是正確的。 Java中的Hmac模塊需要一個字節編碼輸入。此外,我必須將python代碼調整爲java代碼。 python代碼有什麼錯誤? – user2534685

+0

爲什麼你需要調整python代碼?通過這些更改,python和java都得到了相同的結果。 – alpert

+0

我必須編寫python代碼來與現有系統進行通信。 java代碼與系統一起工作,是我的模板。 – user2534685