在JUnit中生成HmacSHA256签名

19

我正在尝试在JUnit测试中为Amazon AWS签署消息,但遇到了问题。 这是我正在使用的代码:

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配置非常错误。你可能在Java类路径中混合了自己版本的jce.jar吗?现代的Java已经内置了所有的加密库。 - President James K. Polk
请注意:您发布的代码无法编译,如果您进行更改以使其编译,它将永远不会出现此错误消息(您指定了“HmacSHA256”,但错误消息显示“HmacSHA1”)。虽然像Greg所说,我猜测这是配置错误。 - Paŭlo Ebermann
1个回答

58

很抱歉我没有完全添加所有内容。上面的代码是使用junit和powermockito进行测试的。但是,powermockito无法增强javax.crypto类,因此我不得不在junit中添加@PowerMockIgnore("javax.crypto.*")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接