คุณได้ถามคำถามที่ยอดเยี่ยม คำถามดูเหมือนง่ายมาก แต่จริงๆแล้วคำตอบนั้นค่อนข้างซับซ้อน ฉันจะพยายามอย่างดีที่สุดเพื่อตอบคำถามให้กระชับ นอกจากนี้เนื่องจากคุณพูดถึง ISAKMP ฉันจะถือว่าคุณสนใจ IKEv1 สิ่งต่าง ๆ เปลี่ยนไปเล็กน้อยสำหรับ IKEv2 (ดีมาก) แต่ฉันต้องการพูดถึงคำตอบด้านล่างที่เกี่ยวข้องกับ IKEv1 เท่านั้น
ขั้นตอนที่ 1 สามารถทำได้ในสอง mods ต่างกัน: Main Mode และ Aggressive Mode ในโหมดใดโหมดหนึ่งข้อความแรกจะถูกส่งโดย Initiator และข้อความที่สองจะถูกส่งโดย Responder ทั้งสองข้อความเหล่านี้รวมถึงสิ่งที่เป็นที่รู้จักกันในโลกการเข้ารหัสเป็นNonce Nonce เป็นเพียงตัวเลขที่สร้างแบบสุ่มเพื่อใช้ในการสร้างคีย์ (ระยะ Nonce มาจาก _N_umber ใช้ _Once_) ดังนั้นหลังจากข้อความที่ 1 และข้อความที่ 2 ทั้งสองฝ่ายรู้จัก Nonces ของกันและกัน
Nonce ถูกรวมเข้ากับ Pre-Shared-Key เพื่อสร้างค่า Seed สำหรับการสร้างคีย์ลับ ส่วนสัมพันธ์ของIKE RFCอยู่ที่นี่:
For pre-shared keys: SKEYID = prf(pre-shared-key, Ni_b | Nr_b)
SKEYID เป็นค่า Seed ที่จะใช้ในการสร้างคีย์ลับเพิ่มเติมในภายหลัง Pre-Shared-Key และค่า Nonce ทั้งสอง (Ni_b เป็น Nonce ของ Initiator และ Nr_B เป็น Nonce ของ Responder) ถูกรวมเข้าด้วยกันโดยใช้ฟังก์ชัน PRF หรือ Psuedo แบบสุ่ม PRF เปรียบเสมือนอัลกอริธึมการแฮ็กยกเว้นว่าผลลัพธ์อาจมีหลายบิตตามที่คุณต้องการ
ตอนนี้ถ้าคุณกำลังทำโหมดหลักตอนแรกข้อความที่ 3 และ 4 จะแบ่งปันคีย์สาธารณะของผู้ริเริ่มและผู้ตอบคำถาม (ตามลำดับ) ของ Diffie-Hellman พวกเขาทั้งสองใช้ค่าเหล่านี้เพื่อสร้าง Diffie-Hellman ร่วมกันความลับ หากคุณกำลังทำโหมด Aggressive ค่า DH Public เหล่านี้จะรวมอยู่ในข้อความ 1 และข้อความ 2 (พร้อมด้วย Nonces)
จากนั้นค่า Seed จะถูกรวมเข้ากับ DH Shared Secret (และค่าอื่น ๆ สองสาม) เพื่อสร้างคีย์เซสชันสามอัน: คีย์ Derevative, คีย์การรับรองความถูกต้องและคีย์การเข้ารหัส RFC ระบุว่าเป็นเช่นนี้:
ผลลัพธ์ของโหมดหลักหรือโหมดก้าวร้าวคือวัสดุการคีย์ที่ผ่านการตรวจสอบสามกลุ่ม:
SKEYID_d = prf(SKEYID, g^xy | CKY-I | CKY-R | 0)
SKEYID_a = prf(SKEYID, SKEYID_d | g^xy | CKY-I | CKY-R | 1)
SKEYID_e = prf(SKEYID, SKEYID_a | g^xy | CKY-I | CKY-R | 2)
SKEYID_d, _a และ _e เป็นกุญแจสามเซสชันที่กล่าวถึงข้างต้น SKEYID
เป็นค่าเมล็ดพันธุ์ g^xy
คือ DH Shared Secret CKY-I
และCKI-R
เป็นผู้ริเริ่มและคุกกี้ตอบกลับค่าเหล่านี้เป็นเพียงค่าเพิ่มเติมที่สร้างแบบสุ่มซึ่งจะใช้ในภายหลังเพื่อระบุการแลกเปลี่ยน ISAKMP และการเชื่อมโยงด้านความปลอดภัยโดยเฉพาะ 0 1 2
คือตัวเลขที่แท้จริง 0, 1 และ 2 สัญลักษณ์ Pipe |
แสดงถึงการต่อข้อมูล
ไม่ว่าในกรณีใดค่าทั้งหมดเหล่านี้จะถูกรวมเข้าด้วยกันโดยใช้ PRF ซึ่งสร้างคีย์เซสชันสามคีย์:
- รหัสอนุพันธ์ - รหัสนี้ไม่ได้ใช้โดย ISAKMP และส่งมอบให้กับ IPsec แทนเพื่อให้ IPsec สามารถสร้างรหัสลับของตัวเอง
- คีย์การรับรองความถูกต้อง - คีย์นี้ใช้โดย ISAKMP ใน HMAC (อัลกอริทึมการแฮชที่ปลอดภัยด้วยคีย์ลับ)
- คีย์การเข้ารหัส - คีย์นี้ใช้โดย ISAKMP เพื่อเข้ารหัสสิ่งที่สมมาตร ISAKMP ต้องการอย่างปลอดภัยกับเพื่อนคนอื่น ๆ ดังนั้นหากอัลกอริทึมการเข้ารหัสที่เลือกสำหรับระยะที่ 1 คือ AES AES จะใช้คีย์นี้เพื่อเข้ารหัสข้อมูลแบบสมมาตร - AES จะไม่สร้างวัสดุการคีย์ของตัวเอง
คีย์การพิสูจน์ตัวตนและคีย์การเข้ารหัสใช้เพื่อรักษาความปลอดภัย / เข้ารหัสการเจรจาต่อรองระยะที่ 2 ในโหมดหลักข้อความ 5 และ 6 ของเฟส 1 จะได้รับการปกป้องด้วยปุ่มเหล่านี้ นอกจากนี้การแลกเปลี่ยนข้อมูล ISAKMP ในอนาคต (DPD, เหตุการณ์ Rekey, ลบข้อความ, ฯลฯ ) จะได้รับการปกป้องด้วยสองปุ่มนี้
รหัสอนุพันธ์ส่งมอบให้กับ IPsec และ IPsec สร้างวัสดุกุญแจของตนเองจากคีย์นี้ หากคุณจำ IPsec ไม่ได้รวมกลไกการแลกเปลี่ยนคีย์ไว้ด้วยตนเองดังนั้นวิธีเดียวที่จะได้รับคีย์ลับคือการตั้งค่าด้วยตนเอง (ซึ่งเก่าและไม่เคยทำจริง ๆ อีกต่อไป) หรือขึ้นอยู่กับบริการภายนอก จัดหาวัสดุสำหรับคีย์เช่น ISAKMP
RFC บอกว่ามันเป็นเช่นนั้น:
SKEYID_e เป็นวัสดุที่สำคัญที่ใช้โดย ISAKMP SA เพื่อปกป้องความลับของข้อความ
SKEYID_a เป็นวัสดุทำกุญแจที่ ISAKMP SA ใช้ในการตรวจสอบความถูกต้องของข้อความ
SKEYID_d เป็นวัสดุการคีย์ที่ใช้เพื่อรับคีย์สำหรับการเชื่อมโยงความปลอดภัยที่ไม่ใช่ของ ISAKMP
จากทั้งหมดที่กล่าวมาเราสามารถอ้างอิงกลับไปยังคำถามของคุณ: มีการใช้คีย์ใดเพื่อรักษาความปลอดภัย Pre-Shared-Key
ในโหมดหลัก Pre-Shared-Key (PSK) ได้รับการตรวจสอบในข้อความ 5 และ 6 ข้อความ 5 และ 6 ได้รับการป้องกันโดยคีย์เซสชันที่ ISAKMP สร้างขึ้นตามที่อธิบายไว้ข้างต้น
ในโหมดก้าวร้าวไม่มีข้อความใด ๆ ในการเจรจาถูกเข้ารหัส และ PSK ได้รับการตรวจสอบในข้อความที่ 2 และ 3 ข้อสังเกตฉันบอกว่าทั้งสองกรณี PSK นั้นได้รับการตรวจสอบแล้วและฉันไม่เคยบอกว่า PSK นั้นแลกเปลี่ยนกัน เห็นได้ชัดว่าหากไม่มีสิ่งใดในโหมด Aggressive ที่ถูกเข้ารหัสและคุณเพียงส่ง Pre-Shared-Key ข้ามสายที่ไม่ได้เข้ารหัสจะมีช่องโหว่ด้านความปลอดภัยที่ใหญ่โต
โชคดีสำหรับเราผู้เขียนของ ISAKMP ก็คิดเช่นนั้น และเป็นผลให้พวกเขาสร้างวิธีพิเศษในการตรวจสอบว่าแต่ละฝ่ายมี PSK ที่ถูกต้องโดยไม่ต้องแชร์ผ่านสายจริง : มีสองรายการที่มีการใช้ในการตรวจสอบไปยังแต่ละ Peer ว่าพวกเขาทั้งสองมี PSK เดียวกันวิธีเอกลักษณ์และแฮเอกลักษณ์
VPN Peers สามารถเลือกที่จะระบุตัวตนของพวกเขาด้วยวิธีการต่าง ๆ ; โดยทั่วไปเพียร์ก็จะใช้ที่อยู่ IP ของแหล่งที่มา แต่พวกเขามีตัวเลือกในการใช้ FQDN หรือชื่อโฮสต์ แต่ละสิ่งเหล่านี้พร้อมกับค่าสหสัมพันธ์สำหรับวิธีการที่เลือกเป็นสิ่งที่ประกอบกันเป็นวิธีการระบุตัวตน ดังนั้นสำหรับตัวอย่างเช่นถ้าผมมี IP 5.5.5.5 และฉันต้องการที่จะใช้ที่อยู่ IP ของฉันที่จะระบุตัวเองของฉันวิธี IDได้อย่างมีประสิทธิภาพจะเป็น[IP Address, 5.5.5.5] (หมายเหตุ: ค่าทั้งสองเป็นวิธีการ ID ทั้งหมด)
วิธี ID จะรวมกันแล้ว (ใช้ PRF ก) ด้วยค่าเมล็ดพันธุ์ที่เราพูดถึงก่อนหน้านี้ (SKEYID) และค่าอื่น ๆ ไม่กี่เพื่อสร้างเอกลักษณ์ของแฮ จำได้ว่าสิ่งที่สร้าง SKEYID ตั้งแต่แรกคือ Pre-Shared-Key
จากนั้นวิธีการ ID และรหัสแฮชจะถูกส่งข้ามสายและอีกฝ่ายพยายามสร้าง ID แฮชอีกครั้งโดยใช้สูตรเดียวกัน หากผู้รับสามารถสร้างแฮช ID เดียวกันได้อีกครั้งจะเป็นการพิสูจน์ให้ผู้รับทราบว่าผู้ส่งจะต้องมีคีย์ที่แชร์ล่วงหน้าที่ถูกต้อง
นี่คือคำอธิบายใน RFC ที่นี่:
ในการตรวจสอบความถูกต้องของการแลกเปลี่ยนริเริ่มของโปรโตคอลสร้าง HASH_I และตอบกลับสร้าง HASH_R ที่:
HASH_I = prf(SKEYID, g^xi | g^xr | CKY-I | CKY-R | SAi_b | IDii_b )
HASH_R = prf(SKEYID, g^xr | g^xi | CKY-R | CKY-I | SAi_b | IDir_b )
IDii และ IDir เป็นวิธีการ ID และ HASH_I และ HASH_R เป็นผู้ริเริ่มและแฮชของ Responder ทั้งสองสิ่งนี้ถูกแชร์ในเฟส 1 จาก RFC:
เมื่อทำการตรวจสอบคีย์ที่แบ่งปันล่วงหน้าโหมดหลักจะถูกกำหนดดังนี้:
Initiator Responder
---------- -----------
HDR, SA -->
<-- HDR, SA
HDR, KE, Ni -->
<-- HDR, KE, Nr
HDR*, IDii, HASH_I -->
<-- HDR*, IDir, HASH_R
โหมด Aggressive พร้อมคีย์ที่แบ่งปันล่วงหน้ามีการอธิบายดังนี้:
Initiator Responder
----------- -----------
HDR, SA, KE, Ni, IDii -->
<-- HDR, SA, KE, Nr, IDir, HASH_R
HDR, HASH_I -->
และในที่สุดเราก็สามารถตอบคำถามของคุณได้อย่างเต็มที่:
Pre-Shared-Key จะรวมกันโดยใช้ PRF กับ Nonces และกลุ่มของค่าอื่น ๆ ที่คนอื่น ๆ รู้จักในการเจรจา ผลที่ได้คือค่าที่สามารถบรรลุร่วมกันโดยทั้งสองฝ่ายหากทั้งสองฝ่ายเริ่มต้นด้วยค่าเดียวกัน - หรือที่เรียกว่า pre-shared-key เดียวกัน ค่าผลลัพธ์คือสิ่งที่แชร์บน wire โดยอนุญาตให้ทั้งสองฝ่ายยืนยันว่าพวกเขามีการจับคู่ Pre-Shared-Keys โดยไม่เปิดเผยข้อมูลใด ๆ เกี่ยวกับ Pre-Shared-Key เอง
โหมดหลักไปอีกขั้นหนึ่งที่ปลอดภัยยิ่งขึ้นด้วยการเข้ารหัสการแลกเปลี่ยน "ผลลัพธ์ที่ได้" ตามที่อธิบายไว้ข้างต้นทำให้ยากยิ่งขึ้นในการดึงข้อมูลที่เป็นประโยชน์เกี่ยวกับสิ่งที่ Pre-Shared-Key ใช้
(ดูเหมือนว่าฉันล้มเหลวอย่างน่าสังเวชที่จะตอบคำถามสั้น ๆ นี้)