2011-09-16 6 views
10

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.

+1

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

+0

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

Respuesta

34

Lo siento, no agregué todo. El código anterior se probó usando junit y powermockito. Pero powermockito no puede mejorar las clases de javax.crypto, así que tuve que agregar @PowerMockIgnore("javax.crypto.*") al junit.

+0

Estaba teniendo un problema similar al usar PowerMock y java.crypto. Agregar el ignorar solucionó el problema por mí. – XORshift

+0

Funciona para mí también. Gracias :) – Ajit

+0

1000 me gusta a esta respuesta, salvó mi día. – Samiron