Estoy intentando firmar mi mensaje a Amazon AWS (dentro de la prueba JUnit), pero me encontré con un problema. Aquí está el código que estoy usando:Generando firma HmacSHA256 en 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);
En la línea marcada (mac.init(...)
) java lanza una excepción:
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*..)
¿Sabe usted por qué sucede? Todos los códigos que he visto en la red se ven casi exactamente así, también probé con HmacSHA1, con los mismos resultados.
Esa excepción sugiere que su configuración de Java es muy incorrecta. ¿Quizás estés mezclando tu propia versión de jce.jar en algún lugar en el classpath de Java? Modern Java ya tiene todas las bibliotecas de cifrado integradas. –
Solo una nota: el código que publicó no se compila, y si realiza los cambios para que se pueda compilar, nunca daría este mensaje de error (especifique "HmacSHA256", pero el mensaje de error dice "HmacSHA1"). Supongo que un error de configuración, como dijo Greg, sin embargo. –