【发布时间】:2011-09-16 09:47:04
【问题描述】:
我正在尝试将我的消息签名到 Amazon AWS(在 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);
在标记为 (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 配置非常错误。您是否可能在 Java 类路径中的某处混入您自己的 jce.jar 版本?现代 Java 已经内置了所有加密库。
-
请注意:您发布的代码无法编译,如果您进行更改以使其编译,它将永远不会给出此错误消息(您指定“HmacSHA256”,但错误消息说“HmacSHA1”)。不过,我想是配置错误,就像 Greg 说的那样。
标签: java junit cryptography powermock cryptoapi