JWT解密,但抛出mac check failed错误

时间:2017-04-25 18:04:39

标签: java spring-boot jwt jhipster jose

我有一个jhipster spring boot应用程序,它接受由第三方生成的令牌,该令牌已使用我们的公钥加密。我有一个JWTFilter,它使用我们的私钥解密令牌,并创建一个存储在安全上下文中的身份验证对象。一旦执行到达控制器,我打算从安全上下文中提取用户名和密码,这样我就可以将API调用回第三方应用程序。

这在某种程度上在我们的集成环境中起作用,其中第三方具有指向我们的应用程序的运行实例的链接。要在本地测试,我正在访问集成环境中的链接,并复制令牌。然后我从Postman向我们的应用程序实例发出请求我正在本地运行,标题中添加了令牌,与我们的js客户端相同。

我使用“com.nimbusds:nimbus-jose-jwt:4.23”进行解密,我收到“MAC check failed”错误。我可以在调试器中将macCheckPassed的值更改为true,并且解密将完成,允许我查看声明并将它们加载到安全上下文中。但是,其他一些过滤器正在抓住我的黑客,请求因授权错误而被拒绝。

public static byte[] decryptAuthenticated(final SecretKey secretKey,
                                      final byte[] iv,
                                      final byte[] cipherText,
                                      final byte[] aad,
                                      final byte[] authTag,
                                      final Provider ceProvider,
                      final Provider macProvider)
    throws JOSEException {


    // Extract MAC + AES/CBC keys from input secret key
    CompositeKey compositeKey = new CompositeKey(secretKey);

    // AAD length to 8 byte array
    byte[] al = AAD.computeLength(aad);

    // Check MAC
    int hmacInputLength = aad.length + iv.length + cipherText.length + al.length;
    byte[] hmacInput = ByteBuffer.allocate(hmacInputLength).
        put(aad).
        put(iv).
        put(cipherText).
        put(al).
        array();
    byte[] hmac = HMAC.compute(compositeKey.getMACKey(), hmacInput, macProvider);

    byte[] expectedAuthTag = Arrays.copyOf(hmac, compositeKey.getTruncatedMACByteLength());

    boolean macCheckPassed = true;

    if (! ConstantTimeUtils.areEqual(expectedAuthTag, authTag)) {
        // Thwart timing attacks by delaying exception until after decryption
        macCheckPassed = false;
    }

    byte[] plainText = decrypt(compositeKey.getAESKey(), iv, cipherText, ceProvider);

    if (! macCheckPassed) {

        throw new JOSEException("MAC check failed");
    }

    return plainText;
}

什么是MAC检查?我认为这与令牌的来源有关。使用源系统的MAC ID加密令牌的某些内容,当它与我当前的主机不同步时会抛出错误。

如果解密通过,还有哪个过滤器拒绝请求?是否有其他标志我应该设置所以框架将遵守请求?

1 个答案:

答案 0 :(得分:1)

JWE规范要求authenticated encryption,以确保纯文本不仅加密,而且还防止篡改。确保内容加密后HMAC is applied

“Mac check failed”错误可能意味着两件事 - 生成原始JWE / JWT的库已错误地应用了HMAC,或者JWE / JWT在传输过程中被修改。