【问题标题】:No exception thrown from Base32 after commons-codec upgrade在 commons-codec 升级后 Base32 没有抛出异常
【发布时间】:2021-07-09 07:39:49
【问题描述】:

我有一个TOTP Authenticator 项目,它使用TOTP (RFC 6238) 生成一个六位数的一次性密码。在内部它使用来自 Apache Commons Codec 的 Base32 类:

Base32 base32 = new Base32();

commons-codec 升级1.14 -> 1.15之后,单元测试开始失败:

@Test
void testInvalidBase32Value() {
  String secretKey = "AHXQ2W5P6AGKYVK";

  Executable when = () -> generator.generateOtp(secretKey);

  assertThrows(IllegalArgumentException.class, when);
}
org.opentest4j.AssertionFailedError: Expected java.lang.IllegalArgumentException to be thrown, but nothing was thrown.

如何修复测试?

【问题讨论】:

    标签: java totp apache-commons-codec


    【解决方案1】:

    根据 Apache Commons Codec 1.15 release notes,默认解码策略已更改:

    Base32/Base64/BCodec:添加了严格的解码属性来控制尾随位的处理。默认的宽松模式会毫无错误地丢弃它们。严格模式引发异常。

    BaseNCodec.java中定义了新的默认解码策略:

    protected static final CodecPolicy DECODING_POLICY_DEFAULT = CodecPolicy.LENIENT;
    

    要修复单元测试,请将解码策略设置为CodecPolicy.STRICT in generateOtp()

    Base32 base32 = new Base32();
    ->
    Base32 base32 = new Base32(0, null, false, PAD_DEFAULT, CodecPolicy.STRICT);
    

    现在导致编解码器失败的数据应该引发异常。

    【讨论】:

      猜你喜欢
      • 2016-04-30
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多