Score:2

การสืบทอดคีย์ AWS ลายเซ็น v4

ธง ht

การสร้างส่วนหัวการให้สิทธิ์ด้วยลายเซ็น AWS v4 เกี่ยวข้องกับการรับรหัสการลงนามดังต่อไปนี้:

https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html

ไบต์แบบคงที่ [] HmacSHA256 (ข้อมูลสตริง, คีย์ไบต์ []) โยนข้อยกเว้น {
    อัลกอริทึมสตริง = "HmacSHA256";
    Mac mac = Mac.getInstance(อัลกอริทึม);
    mac.init (SecretKeySpec ใหม่ (คีย์, อัลกอริทึม));
    ส่งคืน mac.doFinal (data.getBytes ("UTF-8"));
}

ไบต์แบบคงที่ [] getSignatureKey (คีย์สตริง, สตริง dateStamp, สตริงชื่อภูมิภาค, สตริง serviceName) โยนข้อยกเว้น {
    ไบต์ [] kSecret = ("AWS4" + คีย์).getBytes ("UTF-8");
    ไบต์ [] kDate = HmacSHA256 (dateStamp, kSecret);
    ไบต์ [] kRegion = HmacSHA256 (regionName, kDate);
    ไบต์ [] kService = HmacSHA256 (ชื่อบริการ, kRegion);
    ไบต์ [] kSigning = HmacSHA256 ("aws4_request", kService);
    ส่งคืน kSigning;
}
  1. อะไรคือประโยชน์ของการคำนวณ HMAC ดังที่แสดงไว้ด้านบนในหลายขั้นตอนต่อมา แทนที่จะทำการคำนวณ HmacSHA256 เพียงรายการเดียวบนอินพุตที่ต่อกัน (dateStamp, regionName และ serviceName)
  2. ประโยชน์ของวิธีการข้างต้นแทนการใช้มาตรฐาน HKDF คืออะไร
Score:3

รูปแบบที่สลับกันทำให้แต่ละขั้นตอนดำเนินการโดยเอนทิตีที่แตกต่างกัน

  1. เซิร์ฟเวอร์กลางจัดเก็บคีย์หลักและไม่สื่อสารกับผู้อื่น เซิร์ฟเวอร์กลางนี้ควรมีความพร้อมใช้งานสูงและมีความปลอดภัยสูง แต่อาจมีปริมาณงานต่ำ สามารถเก็บคีย์ไว้ในไฟล์ โมดูลความปลอดภัยของฮาร์ดแวร์.
  2. ขั้นตอนแรกรวมคีย์กับหมายเลขเวอร์ชันของโปรโตคอลด้วยวิธีที่ชัดเจน ("AWS4" + คีย์). ซึ่งช่วยให้การอัปเกรดโปรโตคอลใช้คีย์เดียวกันได้ คุณจึงไม่ต้องแจกจ่ายคีย์ใหม่พร้อมกันกับการอัปเกรดโปรโตคอล
  3. ขั้นตอนที่สองรวมคีย์กับวันที่ (HMAC(dateStamp, "AWS4" + คีย์); เดอะ โปรโตคอลระบุ ประทับวันที่ด้วยความละเอียด 1 วัน) คีย์เปลี่ยนทุกวัน การเปลี่ยนแปลงที่เร็วขึ้นต้องการปริมาณงานมากขึ้นบนเซิร์ฟเวอร์กลาง ในขณะที่การเปลี่ยนแปลงที่ช้ากว่าหมายถึงผลกระทบที่มากขึ้นในกรณีที่บางสิ่งในห่วงโซ่ถูกบุกรุก
  4. ทุกวัน เซิร์ฟเวอร์แต่ละภูมิภาคจะขอรหัสภูมิภาคของวัน kRegion = HMAC(regionName, HMAC(dateStamp, "AWS4" + คีย์)). เซิร์ฟเวอร์กลางสามารถรับรองความถูกต้องของเซิร์ฟเวอร์ภูมิภาคเพื่อให้แน่ใจว่าเซิร์ฟเวอร์ของภูมิภาคที่กำหนดเท่านั้นที่สามารถรับรหัสภูมิภาคได้
  5. แต่ละบริการที่ใช้รหัสร้องขอรหัสของตนเอง kService = HMAC(kRegion ชื่อบริการ) จากภูมิภาคที่ทำงานอยู่ เซิร์ฟเวอร์ภูมิภาคสามารถรับรองความถูกต้องของบริการเพื่อให้แน่ใจว่าบริการจะไม่เรียนรู้รหัสของบริการอื่น
  6. บริการรวมรหัสเข้ากับวัตถุประสงค์: kSigning = HMAC(kService, "aws4_request"). สิ่งนี้ทำให้สามารถใช้มาสเตอร์คีย์เดียวกันเพื่อวัตถุประสงค์ที่แตกต่างกันได้หากจำเป็น

ข้อดีของการส่ายนี้คือผู้เข้าร่วมแต่ละคนมีสิทธิ์เข้าถึงคีย์ของตนเองเท่านั้น เป็นไปไม่ได้ที่จะหามาสเตอร์คีย์ที่กำหนด ภูมิภาคหรือเพื่อค้นหารหัสภูมิภาคที่กำหนด kServiceหรือค้นหารหัสบริการที่กำหนด kSigning. สิ่งนี้ช่วยลดผลกระทบของการประนีประนอม: เฉพาะผู้เข้าร่วมในห่วงโซ่เท่านั้นที่ได้รับผลกระทบ ตัวอย่างเช่น หากพบการละเมิดในศูนย์ข้อมูลของอเมริกาในวันที่ 2022-01-05 และบันทึกแสดงว่ามีการละเมิดเกิดขึ้นในวันที่ 2022-01-01 เฉพาะลายเซ็นที่ทำขึ้นหลังวันที่ 2022-01-01 ในภูมิภาคอเมริกาเท่านั้นที่น่าสงสัยและอาจ จำเป็นต้องถูกเพิกถอน ลายเซ็นที่ผลิตในยุโรปหรือก่อนปี 2022-01-01 ยังดีอยู่

แน่นอนว่าการปรับใช้ขนาดใหญ่เท่านั้นที่จะใช้ประโยชน์จากความยืดหยุ่นนี้ได้ ในแอปพลิเคชันส่วนใหญ่ การคำนวณทั้งหมดจะทำในซอฟต์แวร์ชิ้นเดียวกันในฟังก์ชันเดียว แต่โปรโตคอลจะขยายไปสู่การใช้งานขนาดใหญ่ที่ใช้การแบ่งส่วนเพื่อลดผลกระทบจากการละเมิด

รวมอินพุตทั้งหมดในครั้งเดียว:

us flag
@automatictester อันที่จริง สิ่งนี้ได้อธิบายไว้ในหนึ่งในประเด็นสำคัญในปีนี้ re:Invent จุดประสงค์หลักคือการมอบหมายการรับรองความถูกต้องให้กับแต่ละภูมิภาค/บริการ แต่ละบริการจะได้รับรหัสที่ได้รับสำหรับผู้ใช้เมื่อใช้งานได้ในวันนั้น ดังนั้นบริการเองจึงไม่สามารถเข้าถึงรหัสลับได้ แต่บริการก็ไม่จำเป็นต้องติดต่อ IAM กลางสำหรับแต่ละคำขอเพื่อตรวจสอบสิทธิ์
Score:1
ธง us

ดังนั้นปัญหาที่ AWS กำลังแก้ไขอยู่นี้คือพวกเขามีค่าทูเพิล ได้แก่ บริการ ภูมิภาค และวันที่ปัจจุบัน และพวกเขาต้องการได้รับรหัสลับที่แตกต่างกันซึ่งขึ้นอยู่กับค่าเหล่านี้ทั้งหมด

คุณสามารถดำเนินการต่อกับ PRF ทั่วไปได้ แต่จากนั้นคุณพบปัญหา: กล่าวคือคุณไม่ต้องการให้มีสถานการณ์ที่ค่าที่ไม่ถูกต้องของรายการ tuple ใด ๆ ทำให้เกิดการชนกันของคีย์ ข้อผิดพลาดแบบคลาสสิกเช่น ให้ใช้การเรียงต่อกันแบบตรง และถ้าพวกเขาไม่ระวัง คุณก็จะจบลงด้วย (วันนี้) และ (วันนี้) ให้คีย์เดียวกัน เห็นได้ชัดว่าสตริงที่เล่นที่นี่มีโครงสร้างมากกว่าตัวอย่าง แต่ความกังวลพื้นฐานควรชัดเจน

ตอนนี้ วิธีที่มีประสิทธิภาพที่สุดในการแก้ไขปัญหาข้างต้นคือการใช้ฟังก์ชันจับคู่ที่ รับประกัน ที่ไม่มีทูเพิลอินพุตที่แตกต่างกันสองตัวให้เอาต์พุตเดียวกัน ดังนั้นอินพุตเดียวกันไปยัง PRF อย่างไรก็ตาม การออกแบบฟังก์ชันดังกล่าวยังเกิดข้อผิดพลาดได้เล็กน้อย

ฉัน เดา เป็นเพราะเหตุนี้ AWS จึงเลือกใช้สายการเรียก HMAC ที่ซับซ้อนนี้ ตอนนี้พวกเขาไม่ต้องกังวลเกี่ยวกับฟังก์ชันการจับคู่ที่ซับซ้อนแล้ว สิ่งที่จำเป็นต้องมีคือการประเมิน HMAC จำนวนมาก ซึ่งควรจะเป็นไปได้ในเกือบทุกภาษา/สภาพแวดล้อม ความจริงที่ว่าสิ่งนี้ต้องการการดำเนินการ HMAC ไม่น้อยไปกว่านั้นจะถูกหักล้างด้วยข้อเท็จจริงที่ว่าอินพุตทั้งหมดของการได้มาของคีย์นี้คือ ค่อนข้าง แบบคงที่และคุณสามารถแคชคีย์ได้ประมาณหนึ่งวันหากการดำเนินการของ HMAC ใช้เวลาในการประมวลผลมากสำหรับคุณ

automatictester avatar
ht flag
การคำนวณ HMAC ครั้งเดียวผ่านสตริงที่มีโครงสร้างเช่น `[dateStamp=...;regionName=...;serviceName=...]` เป็นวิธีแก้ปัญหาที่ง่ายกว่าหรือไม่
us flag
@automatictester เป็นอีกทางเลือกหนึ่ง การตัดสินใจในการออกแบบ เมื่ออินพุต "ที่มีโครงสร้าง" อาจมีอินพุตไคลเอ็นต์ใดๆ (คีย์ s3, db row id,.) ฉันจึงค่อนข้างจะใช้แฮชซ้อนมากกว่าเสี่ยงกับความขัดแย้งที่อาจเกิดขึ้น
Gilles 'SO- stop being evil' avatar
@automatictester ทำไมคุณถึงคิดว่ามันจะง่ายกว่านี้? เปรียบเทียบจำนวนบรรทัดของโค้ดสำหรับโซลูชันทั้งสอง และสังเกตว่าหากสตริงที่มีโครงสร้างสร้างได้ง่าย หมายความว่าคุณกำลังเพิ่มไลบรารีการจัดรูปแบบข้อมูลขนาดใหญ่เป็นการขึ้นต่อกัน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา