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