Saya memiliki aplikasi jhipster spring boot yang menerima token yang dihasilkan oleh pihak ketiga yang telah dienkripsi dengan kunci publik kami. Saya memiliki JWTFilter yang mendekripsi token menggunakan kunci pribadi kami dan membuat objek otentikasi yang disimpan dalam konteks keamanan. Setelah eksekusi mencapai pengontrol, saya bermaksud menarik nama pengguna dan kata sandi dari konteks keamanan sehingga saya dapat melakukan panggilan API kembali ke aplikasi pihak ketiga.
Hal ini berfungsi pada tingkat tertentu dalam lingkungan integrasi kami di mana pihak ketiga memiliki tautan ke instance aplikasi kami yang sedang berjalan. Untuk menguji secara lokal, saya menekan tautan di lingkungan integrasi, dan menyalin token. Lalu saya membuat permintaan dari Tukang Pos ke instance aplikasi kami yang saya jalankan secara lokal dengan token yang ditambahkan di header, sama seperti yang dilakukan klien js kami.
Saya menggunakan "com.nimbusds:nimbus-jose-jwt:4.23" untuk dekripsi, dan saya mendapatkan kesalahan 'Pemeriksaan MAC gagal'. Saya dapat mengubah nilai macCheckPassed menjadi true di debugger, dan dekripsi akan selesai, memungkinkan saya melihat klaim dan memuatnya ke dalam konteks keamanan. Namun, beberapa filter lain menangkap peretasan saya, dan permintaan tersebut ditolak dengan kesalahan otorisasi.
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;
}
Apa pemeriksaan MAC ini? Saya pikir itu ada hubungannya dengan asal usul token tersebut. Sesuatu seperti token dienkripsi dengan id MAC dari sistem sumber, yang menimbulkan kesalahan ketika tidak disinkronkan dengan host saya saat ini.
Filter apa lagi yang akan menolak permintaan jika dekripsi berhasil? Apakah ada tanda lain yang harus saya atur sehingga kerangka kerja akan memenuhi permintaan tersebut?