JWT ถอดรหัส แต่ส่งข้อผิดพลาดการตรวจสอบ Mac ล้มเหลว

ฉันมีแอปพลิเคชัน jhipster spring boot ซึ่งยอมรับโทเค็นที่สร้างโดยบุคคลที่สามซึ่งถูกเข้ารหัสด้วยกุญแจสาธารณะของเรา ฉันมี JWTFilter ซึ่งถอดรหัสโทเค็นโดยใช้คีย์ส่วนตัวของเราและสร้างออบเจ็กต์การรับรองความถูกต้องซึ่งจัดเก็บไว้ในบริบทความปลอดภัย เมื่อการดำเนินการไปถึงตัวควบคุม ฉันตั้งใจที่จะดึงชื่อผู้ใช้และรหัสผ่านจากบริบทด้านความปลอดภัย เพื่อที่ฉันจะสามารถทำการเรียก API กลับไปยังแอปพลิเคชันบุคคลที่สามได้

สิ่งนี้ได้ผลในระดับหนึ่งในสภาพแวดล้อมการรวมระบบของเรา โดยที่บุคคลที่สามมีลิงก์ไปยังอินสแตนซ์ที่ทำงานอยู่ของแอปพลิเคชันของเรา เพื่อทดสอบในเครื่อง ฉันกำลังกดลิงก์ในสภาพแวดล้อมการรวม และคัดลอกโทเค็น จากนั้น ฉันส่งคำขอจากบุรุษไปรษณีย์ไปยังอินสแตนซ์ของแอปพลิเคชันของเราที่ฉันใช้งานอยู่ในเครื่องโดยมีโทเค็นเพิ่มในส่วนหัว เช่นเดียวกับที่ไคลเอ็นต์ 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 ของระบบต้นทาง ซึ่งทำให้เกิดข้อผิดพลาดเมื่อไม่ซิงก์กับโฮสต์ปัจจุบันของฉัน

ตัวกรองอื่นใดที่จะปฏิเสธคำขอหากการถอดรหัสผ่าน? มีการตั้งค่าสถานะอื่นใดที่ฉันควรจะตั้งค่าเพื่อให้กรอบงานเป็นไปตามคำขอหรือไม่


person thejames42    schedule 25.04.2017    source แหล่งที่มา


คำตอบ (1)


ข้อมูลจำเพาะของ JWE กำหนดการเข้ารหัสที่มีการตรวจสอบสิทธิ์ เพื่อให้แน่ใจว่าข้อความธรรมดาไม่ได้เข้ารหัสเพียงอย่างเดียว แต่ยังป้องกันการงัดแงะอีกด้วย เพื่อให้แน่ใจว่า HMAC จะถูกนำไปใช้ หลังจากการเข้ารหัสเนื้อหา

ข้อผิดพลาด "การตรวจสอบ Mac ล้มเหลว" อาจหมายถึงสองสิ่ง - ไลบรารีที่สร้าง JWE / JWT ดั้งเดิมใช้ HMAC ไม่ถูกต้อง หรือ JWE / JWT ได้รับการแก้ไขระหว่างการขนส่ง

person Vladimir Dzhuvinov    schedule 26.04.2017