2011-09-16 85 views
10

我試圖將消息簽名到Amazon AWS(JUnit測試內部),但是我遇到了一個問題。 下面是我使用的代碼:在JUnit中生成HmacSHA256簽名

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); 

在行標(mac.init(...))java的拋出異常:

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

你知道爲什麼會發生?我在網上看到的所有代碼看起來幾乎完全像這樣,我也用HmacSHA1嘗試過,結果相同。

+1

該異常表明您的Java配置非常錯誤。你是否可能將自己的jce.jar版本混入了Java類路徑的某個地方?現代Java已經內置了所有的加密庫。 –

+0

只需注意:您發佈的代碼不會編譯,如果您進行了更改以使其可以編譯,則它永遠不會發出此錯誤消息(您指定「HmacSHA256」,但錯誤消息顯示爲「HmacSHA1」)。不過,我想假設一個配置錯誤,就像Greg說的那樣。 –

回答

34

對不起,我沒有添加任何東西。上面的代碼使用junit和powermockito進行了測試。但powermockito無法增強javax.crypto類,所以我不得不將@PowerMockIgnore("javax.crypto.*")添加到junit中。

+0

我在使用PowerMock和java.crypto時遇到了類似的問題。添加忽略修復了我的問題。 – XORshift

+0

也適用於我。謝謝:) – Ajit

+0

1000喜歡這個答案,拯救了我的一天。 – Samiron