我試圖將消息簽名到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嘗試過,結果相同。
該異常表明您的Java配置非常錯誤。你是否可能將自己的jce.jar版本混入了Java類路徑的某個地方?現代Java已經內置了所有的加密庫。 –
只需注意:您發佈的代碼不會編譯,如果您進行了更改以使其可以編譯,則它永遠不會發出此錯誤消息(您指定「HmacSHA256」,但錯誤消息顯示爲「HmacSHA1」)。不過,我想假設一個配置錯誤,就像Greg說的那樣。 –