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.
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. –
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ò. –