การเข้ารหัส SSH ทำงานอย่างไร


34

ฉันได้อ่านเกี่ยวกับการสร้าง 2 คีย์ (ส่วนตัวและสาธารณะ) บนโฮสต์ไคลเอ็นต์และคัดลอกคีย์สาธารณะไปยังโฮสต์เซิร์ฟเวอร์

ตามที่ฉันเข้าใจ (แก้ไขให้ฉันถ้าฉันผิด): เซิร์ฟเวอร์เข้ารหัสข้อมูลด้วยรหัสสาธารณะและส่งไปยังไคลเอนต์ลูกค้าถอดรหัสด้วยรหัสส่วนตัว

แต่ถ้าฉันต้องการเข้ารหัสข้อมูลบนไคลเอนต์เพื่อส่งไปยังเซิร์ฟเวอร์จะเกิดอะไรขึ้น?

กุญแจสาธารณะเข้ารหัสข้อมูลในไคลเอนต์หรือไม่ แต่เซิร์ฟเวอร์จะถอดรหัสได้อย่างไรถ้ามันมีกุญแจสาธารณะเท่านั้น?

การเข้ารหัส SSH ทำงานอย่างไร

คำตอบ:


35

สิ่งแรกหลังจากสร้างการเชื่อมต่อ TCP ทั้งสองระบบจะเห็นด้วยกับคีย์เซสชันโดยใช้โปรโตคอลเช่นการแลกเปลี่ยนคีย์ DH , ECDHหรือ GSSAPI ที่สำคัญนี่คือสมมาตรและชั่วคราว - ทั้งสองฝ่ายใช้คีย์เดียวกันการเข้ารหัสและถอดรหัสข้อมูลโดยใช้ขั้นตอนวิธีการเช่นการเข้ารหัส AESหรือRC4

keypair ของไคลเอ็นต์ไม่เคยถูกใช้สำหรับการเข้ารหัสข้อมูลเพียงเพื่อการพิสูจน์ตัวตน - "publickey" เป็นหนึ่งในวิธีการต่างๆที่มีอยู่ซึ่งลูกค้านำเสนอกุญแจสาธารณะของตัวเองพร้อมหลักฐานการเป็นเจ้าของคีย์ส่วนตัว ในทำนองเดียวกัน keypair ของเซิร์ฟเวอร์จะใช้สำหรับตรวจสอบสิทธิ์เซิร์ฟเวอร์ระหว่างการแลกเปลี่ยนคีย์ DH หรือ ECDH เท่านั้น ไม่มีการเข้ารหัสข้อมูลโดยใช้

โปรโตคอล SSH2 มีการบันทึกไว้ในRFC หลายแห่งรวมถึง:

  • RFC 4253 - โปรโตคอลการขนส่งเลเยอร์ Secure (SSH)
  • RFC 4419 - การแลกเปลี่ยนกลุ่ม Diffie-Hellman
  • RFC 4432 - การแลกเปลี่ยนคีย์ RSA
  • RFC 4462 - การตรวจสอบสิทธิ์ GSSAPI & การแลกเปลี่ยนคีย์

13

สิ่งแรกที่ฉันคิดว่าคุณต้องเข้าใจก็คือในขณะที่โปรโตคอลการเข้ารหัสจำนวนมากเช่น SSH และ SSL ใช้ PKI สำหรับวัตถุประสงค์ในการตรวจสอบสิทธิ์ แต่แทบไม่มีระบบใด ๆ ที่จะใช้ PKI ในการส่งถ่ายข้อมูล

PKI นั้นใช้ CPU มากเกินไปที่จะส่งข้อมูล payload ที่แท้จริง สิ่งที่เกิดขึ้นก็คือ PKI จะใช้ในการต่อรองกับคีย์ที่สร้างแบบสุ่มเพื่อใช้กับโปรโตคอลการเข้ารหัสแบบสมมาตร โปรโตคอลที่จะใช้นั้นมีการเจรจาและควรเป็นโปรโตคอลที่แข็งแกร่งที่สุดที่ทั้งสองระบบสามารถตกลงกันได้ ดังนั้นเมื่อการจับมือและการเจรจาเริ่มต้นเสร็จสิ้นทุกอย่างก็เป็นเพียงการเข้ารหัสแบบสมมาตรมาตรฐาน


2
สำหรับการอ่านเพิ่มเติมนั้นโดยทั่วไปจะอธิบายไว้ในRFC4253หน้า 15
slhck

12

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

ดังนั้นหากคุณต้องการส่งข้อความถึงทุกคนและคุณต้องการให้พวกเขายืนยันว่าข้อความนั้นมาจากคุณและไม่เปลี่ยนแปลงในขณะที่ส่งข้อความคุณจะส่งข้อความของคุณและรวมแฮชของข้อความที่เข้ารหัสด้วยคีย์ A จากนั้นทุกคนที่ มี Key B สามารถถอดรหัสแฮชเปรียบเทียบกับข้อความที่พวกเขาได้รับและตรวจสอบว่าข้อความมาจากคุณ (เนื่องจากข้อเท็จจริงที่ว่ามีเพียงบุคคลที่มีคีย์ A เท่านั้นที่สามารถสร้าง payload เข้ารหัสที่ถอดรหัสแฮชเรียบร้อยแล้วและเนื่องจากคุณ เป็นคนเดียวที่มีคีย์ A ซึ่งอาจมาจากคุณเท่านั้น) นี้เรียกว่าการลงนาม

ตอนนี้สมมติว่ามีคนต้องการส่งข้อความลับถึงคุณ แต่ไม่ต้องการเปิดเผยว่าเขาเป็นใคร พวกเขาสามารถเข้ารหัสข้อความด้วยคีย์สมมาตร (ดังที่ Zoredache กล่าวถึงสมมาตรนั้นมีราคาถูกกว่ามาก) จากนั้นนำกุญแจนั้นไปเข้ารหัสด้วย Key B แล้วส่งไปให้คุณ เนื่องจากมีเฉพาะคีย์ A เท่านั้นที่สามารถถอดรหัสบางสิ่งที่ถูกเข้ารหัสด้วยคีย์ B ทำให้บุคคลอื่นไม่สามารถเห็นสิ่งที่อยู่ในข้อความที่ส่งถึงคุณ นี่คือการทำงานของการเข้ารหัสปกติและวิธีการแลกเปลี่ยนข้อมูลของ SSH


3

นี่คือคำอธิบายที่เข้าถึงได้ง่ายของคณิตศาสตร์ที่อยู่เบื้องหลังการทำงานของการเข้ารหัสคีย์ส่วนตัว - สาธารณะ

คำอธิบายขั้นพื้นฐานได้มากขึ้นจากบีบีซีเป็นที่นี่


ฉันได้เพิ่มลิงก์ใหม่ไปยัง BBC เพื่ออธิบายกระบวนการนี้และประวัติบางส่วน
Chogg

1

ที่คุณเขียน

"พับลิกคีย์จะเข้ารหัสข้อมูลบนไคลเอ็นต์หรือไม่ แต่เซิร์ฟเวอร์จะถอดรหัสได้อย่างไรถ้ามันมีรหัสสาธารณะเท่านั้น"

ฉันไม่รู้เรื่องนี้มากนัก แต่ฉันคิดว่าฉันสามารถตอบคำถามนี้ได้ชัดเจน

ถ้า A ต้องการส่งข้อความถึง B A จะใช้พับลิกคีย์ของ B นั่นคือวิธีที่ B สามารถถอดรหัสได้

หาก A ใช้รหัสสาธารณะของเขาเพื่อเข้ารหัสข้อความจริง ๆ แล้ว B จะไม่สามารถถอดรหัสได้

นั่นคือคำอธิบายที่นี่

http://www.comodo.com/resources/small-business/digital-certificates2.php

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.