JWT mendekripsi, tetapi memunculkan kesalahan pemeriksaan mac yang gagal

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?


person thejames42    schedule 25.04.2017    source sumber


Jawaban (1)


Spesifikasi JWE mengamanatkan enkripsi yang diautentikasi, untuk memastikan teks biasa tidak hanya dienkripsi, tetapi juga terlindungi dari gangguan. Untuk memastikan bahwa HMAC diterapkan setelah enkripsi konten.

Kesalahan "Pemeriksaan Mac gagal" dapat berarti dua hal - perpustakaan yang menghasilkan JWE/JWT asli telah salah menerapkan HMAC, atau, JWE/JWT telah dimodifikasi dalam perjalanan.

person Vladimir Dzhuvinov    schedule 26.04.2017