2011-09-16 16 views
10

Sto tentando di firmare il mio messaggio su Amazon AWS (all'interno del test JUnit), ma ho riscontrato un problema. Ecco il codice che sto usando:Generazione della firma HmacSHA256 in JUnit

String secretAccessKey = "secret1234678901";   
SecretKeySpec keySpec = new SecretKeySpec(secretAccessKey.getBytes(UTF-8), "HmacSHA256"); 
Mac mac = Mac.getInstance(this.MAC_ALGO); 
mac.init(keySpec); // here it breaks 
byte[] encoded = mac.doFinal(
    request.toString().getBytes(this.CHARSET)); 
return Base64.encodeBase64URLSafeString(encoded); 

Nella linea marcata (mac.init(...)) java lancia un'eccezione:

java.lang.ClassCastException: com.sun.crypto.provider.HmacSHA1 cannot be cast to javax.crypto.MacSpi 
    at javax.crypto.Mac.a(DashoA13*..) 
    at javax.crypto.Mac.init(DashoA13*..) 

Sapete perché succede? Tutti i codici che ho visto sulla rete sembrano quasi esattamente così, ho anche provato con HmacSHA1, con gli stessi risultati.

+1

Questa eccezione indica che la configurazione di Java è molto errata. Stai forse mixando la tua versione di jce.jar da qualche parte nel classpath Java? Java moderno ha già tutte le librerie crittografiche integrate. –

+0

Solo una nota: il codice che hai postato non viene compilato, e se apporti le modifiche per farlo compilare, non darebbe mai questo messaggio di errore (tu specifichi "HmacSHA256", ma il messaggio di errore dice "HmacSHA1"). Suppongo un errore di configurazione, come ha detto Greg, però. –

risposta

34

Mi spiace di non aver aggiunto tutto. Il codice sopra è stato testato usando junit e powermockito. Ma powermockito non può migliorare le classi javax.crypto quindi ho dovuto aggiungere @PowerMockIgnore("javax.crypto.*") alla junit.

+0

Stavo riscontrando un problema simile con PowerMock e java.crypto. Aggiungere l'ignore ha risolto il problema per me. – XORshift

+0

Funziona anche per me. Grazie :) – Ajit

+0

1000 piace a questa risposta, ha salvato la mia giornata. – Samiron

Problemi correlati