2016-04-23 2 views
2

J'essaie de générer la même signature Hmac-SHA256 en Python que dans mon template Java. Mais le script Python ne génère pas la même sortie. Je ne peux pas trouver mon erreur. Quelqu'un peut-il m'aider?Java et Python génèrent différentes sorties Hmac-SHA256

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)); 
    } 
} 

Hash: PIcn4BmkK0RGZ6WHtgASUb7K2ruza/7YCHqSwYiC0RE =

Signature: 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)) 

Hash: PIcn4BmkK0RGZ6WHtgASUb7K2ruza/7YCHqSwYiC0RE =

Signature: NE8RtuFsOtafWrwDdlzILMgqCDm2huJ9A3IO6iy44Jc =

Répondre

1

Le problème est dans le code python vous revenez base64 mais en Java vous imprimez simplement comme base64, mais sans retour.

Essayez:

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(); 
} 

Ou modifier le code python comme:

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

Il est juste. Le module Hmac de Java nécessite une entrée codée en octets. Aussi, je dois ajuster le code python au code java. Quel est le problème dans le code python? – user2534685

+0

Pourquoi avez-vous besoin d'ajuster le code python? Avec ces changements, python et java donnent le même résultat. – alpert

+0

Je dois écrire le code python pour communiquer avec un système existant. Le code Java fonctionne avec le système et est mon modèle. – user2534685