2016-10-21 2 views
0

J'ai un problème étrange avec ma fonction. J'essaie d'obtenir une donnée cryptée HMAC à partir d'une clé secrète. J'ai travaillé sur un test unitaire pour essayer mon algorithme, et ça a bien fonctionné.Résultat de cryptage HMAC différent de JUnit test et Spring

Voici le code, avec données difficiles pour le rendre plus facile à tester:

public static String hmac(String parameters, String key) { 
    String result = ""; 
    parameters = "PBX_SITE=1999888&PBX_RANG=32&PBX_IDENTIFIANT=2&PBX_TOTAL=1000&PBX_DEVISE=978&PBX_CMD=TEST TEST&[email protected]&PBX_RETOUR=Mt:M;Ref:R;Auto:A;Erreur:E;Id:U&PBX_HASH=SHA512&PBX_TIME=2011-02-28T11:01:50+01:00&PBX_TYPEPAIEMENT=CARTE&PBX_TYPECARTE=CB&PBX_AUTOSEULE=O"; 
    key = "ABCDEFABCDEFABCDEFABCDEFABCDEFABCDEFABCDEFABCDEF"; 

    try{ 
     final String HMAC_SHA512 = "HmacSHA512"; 
     Mac sha512_HMAC = Mac.getInstance(HMAC_SHA512); 

     //pack 
     String input = key.length() % 2 == 0 ? key : key + "0"; 
     StringBuilder output = new StringBuilder(); 
     for (int i = 0; i < input.length(); i+=2) { 
      String str = input.substring(i, i+2); 
      output.append((char)Integer.parseInt(str, 16)); 
     } 
     key = output.toString(); 

     SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), HMAC_SHA512); 
     sha512_HMAC.init(keySpec); 

     byte [] mac_data = sha512_HMAC.doFinal(parameters.getBytes()); 

     //toHex 
     result = String.format("%040x", new BigInteger(1, mac_data)).toUpperCase(); 
     System.out.println(result); 

    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InvalidKeyException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally{ 
     System.out.println("Done"); 
    } 

    return result; 
} 

Quand j'appelle cette fonction avec mon test unitaire, le résultat est très bien:

String hmac2 = AboWebUtils.hmac(parameters, key); 

9D47FFC1779013D1D26F92EE1C858AD7ECE5333106D4D61892BC683F640B061A72124F72A5B7BCD445767E347F9BA8ADE9A08A36791669E32E99C17975BD2FC2

Lorsque j'appelle cette méthode depuis y web app (Spring framework), j'ai reçu une annonce résultat DIFFÉRENTS (wrong):

AboWebUtils.hmac(parameters, key); 

14BC65DEC5AF3CEED21F024D6A5665F6C8BDF90F956F8D327E0382A3A7F09ACEF557A2C5CE72F32D0CA2B3FBBE344CE5D2798526817E5647210D663AEA9BB899

Je ne comprends pas pourquoi les résultats sont différents. J'appelle la même méthode, les paramètres sont même remplacés à des fins de test. Je devrais obtenir le même résultat. JUnit & Le printemps n'appelle pas la méthode de la même manière ou quelque chose comme ça?

Merci pour votre aide :)

+0

version la plus probablement différente de la classe est utilisée. Essayez de tout nettoyer et de reconstruire votre application. – talex

+0

Hey Talex :) J'ai essayé de nettoyer mes projets, mais le problème persiste :( – Moustik

+0

Lorsque j'essaie d'exécuter votre code, je reçois une sortie complètement différente – talex

Répondre

0

Essayez cette

 byte[] output = new byte[input.length()/2]; 
     for (int i = 0; i < input.length(); i+=2) { 
      String str = input.substring(i, i+2); 
      output[i/2] = (byte) Integer.parseInt(str, 16); 
     } 
     SecretKeySpec keySpec = new SecretKeySpec(output, HMAC_SHA512); 

Avec ce changement, je suis arrivé résultat similaire à votre 9D47FFC1779013D1D26F...

+0

Oh mon dieu, en effet, avec cet algorithme, j'ai les mêmes résultats de mon test unitaire ET mon application web. étrange pour moi, est-ce à cause du risque de caractères illégaux que vous avez mentionné auparavant? – Moustik

+0

En tout cas, merci beaucoup pour votre aide Talex! – Moustik

+0

Oui. Au moins, il aura du sens – talex