2017-04-25 164 views
0

我有一個jhipster彈簧啓動應用程序,它接受由我們的公鑰加密的第三方生成的令牌。我有一個JWTFilter,它使用我們的私鑰解密令牌並創建一個存儲在安全上下文中的認證對象。一旦執行到達控制器,我打算從安全上下文中提取用戶名和密碼,以便我可以將API調用回第三方應用程序。智威湯遜解密,但引發mac檢查失敗錯誤

這在我們的集成環境中在某種程度上起作用,其中第三方鏈接到我們的應用程序的運行實例。爲了在本地進行測試,我正在集成環境中打開鏈接,並複製該令牌。然後,我向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

JWE規範要求authenticated encryption,以確保明文不僅僅是加密,而且還防止篡改。內容加密後確保一個HMAC is applied

「Mac檢查失敗」錯誤可能意味着兩件事 - 產生原始JWE/JWT的庫已錯誤地應用了HMAC,或者JWE/JWT在傳輸過程中進行了修改。