公開鍵で暗号化された第三者によって生成されたトークンを受け入れるjhipsterスプリングブートアプリケーションがあります。私は秘密鍵を使ってトークンを復号化し、セキュリティコンテキストに格納された認証オブジェクトを作成するJWTFilterを持っています。実行がコントローラに達すると、セキュリティコンテキストからユーザー名とパスワードを取得して、サードパーティアプリケーションにAPIコールを戻すことができます。JWTは復号化しますが、MACチェックに失敗しました。
これは、サードパーティがアプリケーションの実行中のインスタンスへのリンクを持っている統合環境である程度機能しています。ローカルでテストするために、私は統合環境でリンクに当たってトークンをコピーしています。それから私は、私たちのアプリケーションのインスタンスに私は、私たちのjsクライアントと同じ、ヘッダーに追加されたトークンを使用してローカルで実行しているリクエストを行います。
暗号化に「com.nimbusds:nimbus-jose-jwt:4.23」を使用していますが、「MACチェックに失敗しました」というエラーが表示されます。私はデバッガで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で暗号化されています。これは、現在のホストと同期しないときにエラーをスローします。
復号化が成功した場合、他のどのフィルタが要求を拒否しますか?フレームワークが要求を尊重するように設定されているはずの他のフラグがありますか?