【问题标题】:Generating HmacSHA256 signature in JUnit在 JUnit 中生成 HmacSHA256 签名
【发布时间】: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


【解决方案1】:

抱歉,我没有添加所有内容。上面的代码是使用 junit 和 powermockito 测试的。但是 powermockito 无法增强 javax.crypto 类,所以我不得不将 @PowerMockIgnore("javax.crypto.*") 添加到 junit。

【讨论】:

  • 我在使用 PowerMock 和 java.crypto 时遇到了类似的问题。添加忽略为我解决了这个问题。
  • 也适合我。谢谢:)
  • 1000 个赞这个答案,拯救了我的一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
相关资源
最近更新 更多