2011-09-16 14 views
10

Próbuję podpisać moją wiadomość do Amazon AWS (w teście JUnit), ale napotkałem problem. Oto kod używam:Generowanie podpisu HmacSHA256 w 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); 

W wierszu oznaczonym (mac.init(...)) java zgłasza wyjątek:

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*..) 

Czy wiesz, dlaczego tak się dzieje? Wszystkie kody, które widziałem w sieci wyglądają prawie dokładnie tak, próbowałem również z HmacSHA1, z takimi samymi wynikami.

+1

Ten wyjątek sugeruje, że konfiguracja Java jest bardzo zła. Czy może mieszkasz we własnej wersji jce.jar gdzieś w ścieżce klasowej Java? Nowoczesna Java ma już wbudowane wszystkie biblioteki kryptograficzne. –

+0

Uwaga: opublikowany przez Ciebie kod nie jest kompilowany, a jeśli wprowadzisz zmiany, które pozwolą mu się skompilować, nigdy nie wyświetliłby się ten komunikat o błędzie (określasz "HmacSHA256", ale komunikat o błędzie mówi "HmacSHA1"). Przypuszczam, że błąd konfiguracji, jak powiedział Greg. –

Odpowiedz

34

Niestety nie dodałem wszystkiego. Powyższy kod został przetestowany przy użyciu junit i powermockito. Ale powermockito nie może ulepszyć klas javax.crypto, więc musiałem dodać @PowerMockIgnore("javax.crypto.*") do junit.

+0

Miałem podobny problem podczas korzystania z PowerMock i java.crypto. Dodanie ignorowania rozwiązało problem. – XORshift

+0

Działa również dla mnie. Dzięki :) – Ajit

+0

1000 lubi tę odpowiedź, uratował mój dzień. – Samiron