การใช้เกลือมีจุดประสงค์สองประการ: การแยกโดเมน และ การสกัดแบบสุ่ม.
หากคุณแน่ใจว่า IKM ของคุณ (ข้อมูลการป้อนข้อมูลคีย์ข้อมูล) ถูกใช้ใน "โดเมน" เดียวเท่านั้น คุณไม่จำเป็นต้องใช้เกลือเพื่อจุดประสงค์ในการแยกโดเมน ภายในโดเมนเดียวกัน คุณใช้พารามิเตอร์ข้อมูลแทนเพื่อสร้างคีย์หลายรายการจาก IKM เดียวกันสำหรับบริบทต่างๆ ภายในโดเมน
หาก IKM ของคุณมีการสุ่มแบบสม่ำเสมออยู่แล้ว (เช่น เมื่อเป็นคีย์ส่วนตัวแบบสุ่มแบบสม่ำเสมอซึ่งใช้ในการรับคีย์ย่อยผ่าน HKDF) คุณไม่จำเป็นต้องใช้เกลือเพื่อจุดประสงค์ในการดึงข้อมูลแบบสุ่ม หาก IKM มีความยาวบิตเพียงพอ เพื่อจุดประสงค์ของคุณ
การแยกโดเมน
หน้า 26 ของ "การสกัดการเข้ารหัสและการได้มาของคีย์:
โครงการ HKDF" paper (เรียกว่า [HKDF-paper] ใน rfc5869) แสดงตัวอย่างความจำเป็นของการแยกโดเมนดังต่อไปนี้:
ความสำคัญของความเป็นอิสระดังกล่าวสามารถอธิบายได้จาก
ตามตัวอย่าง "ชีวิตจริง"...
การแลกเปลี่ยน Diffie-Hellman ได้รับการรับรองความถูกต้องโดยการเซ็นชื่อในคีย์ $ก^{xy}$. ใน
ความเป็นจริงสิ่งที่ลงนามคือ $H(g^{xy})$ สำหรับฟังก์ชันแฮชบางอย่าง $H$, พูด
SHA-1 หากลายเซ็นอนุญาตให้กู้คืนข้อความ (เช่น RSA)
ผู้โจมตีไม่เรียนรู้ $ก^{xy}$ แต่ $H(g^{xy})$; ดังนั้นถ้าใคร
คิดถึง $H$ ในฐานะที่เป็น oracle แบบสุ่มไม่มีอะไรจะเรียนรู้ $ก^{xy}$.
ตอนนี้ สมมติว่าโปรโตคอลด้านบนได้รับคีย์ผ่านทางแบบดั้งเดิม
KDF กล่าวคือ คีย์ถูกคำนวณเป็น $H(g^{xy} \mathbin\| v)$ สำหรับบางคน
ค่าสาธารณะ $v$. ในกรณีนี้หากเราปฏิบัติตาม $H$ = ตัวอย่าง SHA-1 และ
สมมติ $ก^{xy}$ มีความยาว 1,024 เราได้รับการคำนวณนั้น $H(g^{xy}\mathbin\|v)$ เป็น
เช่นเดียวกับการคำนวณ $H$ บน $v$ ด้วย IV ของ $H$ ตั้งค่าให้ $H(g^{xy})$ (สำหรับ
ความง่ายถือว่าการคำนวณของ $H$ บน $ก^{xy}$ ไม่ใช้
ความยาวต่อท้าย) อย่างไรก็ตาม นี่หมายความว่าผู้โจมตีเรียนรู้ทั้งหมด
กุญแจตั้งแต่เขารู้ $H(g^{xy})$! ความล้มเหลวของโปรโตคอลไม่ได้
เนื่องจากจุดอ่อนเฉพาะของ $H$ แต่น่าใช้เหมือนกัน
(deterministic) สำหรับสองฟังก์ชันที่แตกต่างกัน: แฮช
ฟังก์ชันที่ใช้กับ $ก^{xy}$ และ กฟผ. ในทางตรงข้าม ถ้าคนหนึ่งคีย์ $H$ ทาง
ค่าเกลือที่ใช้โดย KDF จะบังคับใช้ความเป็นอิสระ
ระหว่างสองฟังก์ชัน
HDKF ประกอบด้วยสองขั้นตอน:
- HKDF-Extract: PRK = HMAC-Hash(เกลือ, IKM)
- HKDF-ขยาย(PRK, ข้อมูล, L) -> OKM
(โดยที่ IKM คือ 'วัสดุคีย์อินพุต', PRK คือ 'คีย์สุ่มเทียม', OKM คือ 'วัสดุคีย์เอาต์พุต', L คือความยาวของเอาต์พุตที่ต้องการ)
ดังนั้น หากไม่มีการใช้เกลือ และค่าของ HMAC-Hash(NULL, IKM) รั่วไหล (เช่น ในสถานการณ์ "กู้คืนข้อความ" ด้านบน) ดังนั้น การใช้ HKDF ทั้งหมดในภายหลังโดยใช้ IKM เดียวกันและไม่มีเกลือจะ ก็ถูกบุกรุกเช่นกัน
หากคุณไม่ต้องการเกลือสำหรับการแยกโดเมน คุณควรพิจารณาว่าคุณต้องการเกลือเพื่อจุดประสงค์ในการแยกข้อมูลแบบสุ่มหรือไม่ คำถามนั้นคือ โพสต์ที่นี่.