เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ · SHA เครื่องคำนวณแฮช
ใบรับรองและ SSH ลายนิ้วมือ: SHA-256 ระบุคีย์สาธารณะได้อย่างไร
· พื้นหลัง
sha-256 การเข้ารหัส ความปลอดภัย
ลายนิ้วมือคือแฮชของใบรับรองหรือคีย์ ซึ่งสั้นพอที่จะอ่านออกเสียงได้ โพสต์นี้อธิบายวิธีคำนวณลายนิ้วมือ TLS และ SSH เหตุใดจึงเปลี่ยนลายนิ้วมือ SHA-1 และสิ่งที่พิสูจน์ได้ว่าตรงกัน
รหัสโฮสต์แจ้งให้คุณยอมรับเสมอ - สิ่งที่ SHA256: บรรทัดขอให้คุณเปรียบเทียบ
เมื่อคุณเชื่อมต่อกับเซิร์ฟเวอร์ผ่าน SSH เป็นครั้งแรก คุณจะเห็นข้อความถามว่าจะยอมรับรหัสโฮสต์หรือไม่ ข้อความแจ้งจะแสดงลายนิ้วมือ: `SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8` หรือที่คล้ายกัน ลายนิ้วมือนี้เป็นแฮชของคีย์สาธารณะของเซิร์ฟเวอร์ คุณกำลังถูกขอให้ยืนยันนอกแบนด์ (นอกโปรโตคอล SSH) ว่าคุณรู้จักคีย์นี้ โดยทั่วไปข้อความแจ้งจะแสดงประเภทคีย์ (RSA, ED25519, ECDSA) และรูปแบบลายนิ้วมือ หากคุณเคยเห็นลายนิ้วมือของกุญแจนี้มาก่อนผ่านช่องทางที่เชื่อถือได้ คุณสามารถพิมพ์ "ใช่" ได้อย่างมั่นใจ ถ้าไม่ การยอมรับหมายถึงการไว้วางใจเครือข่ายในการส่งมอบคีย์ที่ถูกต้อง
ลายนิ้วมือเป็นเพียงผลลัพธ์ของฟังก์ชันแฮชการเข้ารหัสที่ใช้กับคีย์ที่เข้ารหัส สำหรับ SSH คีย์จะถูกเข้ารหัสเป็นไบนารี่หยด (รูปแบบ OpenSSH wire) และแฮชจะถูกคำนวณบนหยดนั้น ลายนิ้วมือจะสั้นกว่าคีย์เต็มทำให้สามารถอ่านและพิมพ์ได้ ลายนิ้วมือเดียวกันจะเป็นผลมาจากคีย์เดียวกันเสมอ ดังนั้นคุณจึงสามารถเปรียบเทียบลายนิ้วมือที่เผยแพร่ในหลายสถานที่หรือหลายช่องทางได้
ลายนิ้วมือเท่ากับแฮชของการเข้ารหัส - ใบรับรอง DER หรือหยดคีย์สาธารณะเป็นอินพุต
คีย์โฮสต์ SSH และใบรับรอง TLS มีการเข้ารหัสแตกต่างกัน แต่หลักการพิมพ์ลายนิ้วมือจะเหมือนกัน สำหรับ SSH ลายนิ้วมือจะคำนวณจากวัสดุคีย์สาธารณะ สำหรับใบรับรอง TLS ลายนิ้วมือจะคำนวณจากใบรับรองทั้งหมด (รวมถึงผู้ออก วันที่มีผล และฟิลด์อื่นๆ) เมื่อคุณเชื่อมต่อกับเว็บเซิร์ฟเวอร์ เบราว์เซอร์จะไม่แสดงลายนิ้วมือใบรับรองแก่คุณ เนื่องจาก TLS ใช้โมเดลที่เชื่อถือได้อื่น: เบราว์เซอร์เชื่อถือชุดของผู้ออกใบรับรอง (CA) ที่ติดตั้งไว้ล่วงหน้า และ CA เหล่านั้นรับรองใบรับรอง SSH ใช้ไม่มี CA ที่ติดตั้งไว้ล่วงหน้า แต่คุณเชื่อถือคีย์เฉพาะและจัดเก็บไว้ในเครื่องใน `~/.ssh/known_hosts` แทน
เนื่องจากลายนิ้วมือรวมไบต์ใบรับรองทั้งหมดสำหรับ TLS การเปลี่ยนวันที่ที่ถูกต้องโดยไม่ต้องลงนามใหม่จะส่งผลให้มีลายนิ้วมืออื่น สำหรับ SSH ลายนิ้วมือจะเป็นของคีย์สาธารณะเท่านั้น ดังนั้นลายนิ้วมือจะคงที่ตราบใดที่ไม่มีการเปลี่ยนแปลงคีย์
เครื่องคิดเลขนี้แสดงให้เห็นถึงความยาว SHA-1 และ SHA-256 คำแนะนำเกี่ยวกับนโยบายลายนิ้วมือจำเป็นต้องมีแหล่งที่มาของโปรโตคอล
ในอดีต ลายนิ้วมือ SSH จะแสดงเป็นเลขฐานสิบหก MD5 MD5 เสียหายด้วยการเข้ารหัสและการชนกันเกิดขึ้นได้จริง ชุมชนความปลอดภัยได้ย้ายไปที่ลายนิ้วมือ SHA-256 เป็นค่าเริ่มต้น คุณอาจยังคงเห็นทั้งสองรูปแบบแสดงโดยไคลเอนต์ SSH ของคุณ: `SHA256: base64` และ `MD5: hex` ลายนิ้วมือ SHA-256 เป็นลายนิ้วมือที่เชื่อถือได้สำหรับการยืนยันตัวตน หากคุณเห็นทั้งสองอย่าง ให้เปรียบเทียบเวอร์ชัน SHA-256 กับลายนิ้วมือจากแหล่งที่เชื่อถือได้ (เว็บไซต์ของเซิร์ฟเวอร์ อีเมลที่ลงนามจากผู้ดูแลระบบ วิกิภายใน) ลายนิ้วมือ MD5 มีความน่าเชื่อถือน้อยลงเนื่องจากมีการชนกันของ MD5
การเปลี่ยนแปลงรูปแบบลายนิ้วมือเป็นสัญญาณที่ชัดเจนของการเปลี่ยนแปลงการเข้ารหัส OpenSSH เวอร์ชันเก่าแสดงเฉพาะ MD5 เวอร์ชันสมัยใหม่จะแสดง SHA-256 ตามค่าเริ่มต้น คำสั่ง `ssh-keygen -l -f /path/to/key` แสดงลายนิ้วมือของคีย์ในรูปแบบเริ่มต้นสำหรับ ssh-keygen เวอร์ชันของคุณ คุณสามารถบังคับใช้รูปแบบเฉพาะด้วยแฟล็ก `-E` (เช่น `-E sha256` หรือ `-E md5`)
base64 ของ SSH SHA256: รูปแบบ — การเปลี่ยนแปลงการเข้ารหัสที่ทำให้ลายนิ้วมือสั้นกว่าฐานสิบหก
SSH ลายนิ้วมือ base64 ใช้รูปแบบที่แตกต่างกัน: โดยนำหน้าด้วยชื่ออัลกอริทึมและโคลอน เช่น `SHA256:base64string` สิ่งนี้แตกต่างจากรูปแบบความสมบูรณ์ของทรัพยากรย่อย (SRI) ซึ่งใช้ยัติภังค์และรวมเฉพาะ base64 มาตรฐานเท่านั้น รูปแบบ SSH มีป้ายกำกับที่ทำให้ไม่คลุมเครือว่าอัลกอริทึมใดที่สร้างการแยกย่อย เมื่อคุณเห็นลายนิ้วมือในเอาต์พุต SSH อัลกอริทึมจะแสดงเสมอ เมื่อคุณเห็นแอตทริบิวต์ความสมบูรณ์ SRI อัลกอริทึมจะถูกเข้ารหัสเป็นคำนำหน้าด้วยยัติภังค์
เอาต์พุต base64 จากเครื่องคำนวณแฮช ToolAcre SHA เป็นรูปแบบมาตรฐาน เพื่อให้ตรงกับ SSH ลายนิ้วมือ ให้เติม `SHA256: ` นำหน้า (ชื่ออัลกอริทึม เครื่องหมายทวิภาค และช่องว่าง) รูปแบบเลขฐานสิบหกจากเครื่องคิดเลขไม่ใช่รูปแบบ SSH ที่แสดง แม้ว่าจะแสดงถึงข้อมูลสรุปเดียวกันและใช้ได้เท่าเทียมกันสำหรับวัตถุประสงค์ในการตรวจสอบ
การจับคู่ที่พิสูจน์ได้ - ว่าคุณถือคีย์ไบต์เดียวกันกับที่อีกฝั่งหนึ่งเผยแพร่ และไม่มีอะไรเกี่ยวกับเจ้าของคีย์เลยหากไม่มีการตรวจสอบนอกกลุ่ม
การจับคู่ลายนิ้วมือจะพิสูจน์สองสิ่ง: ประการแรก คุณเก็บไบต์ของคีย์เดียวกันที่อีกด้านเผยแพร่ และประการที่สอง ว่าทั้งคีย์และลายนิ้วมือไม่ได้รับการเปลี่ยนแปลงนับตั้งแต่มีการคำนวณการแยกย่อย ไม่ได้พิสูจน์ตัวตนของเจ้าของกุญแจหรืออนุญาตการดำเนินการใด ๆ โดยเฉพาะ การตรวจสอบลายนิ้วมือนอกย่านความถี่เป็นเงื่อนไขที่จำเป็น แต่ยังไม่เพียงพอสำหรับการเชื่อถือคีย์ คุณต้องตรวจสอบด้วยว่าบุคคลที่เผยแพร่ลายนิ้วมือคือบุคคลที่พวกเขาอ้างว่าเป็น
ในทางปฏิบัติ หากผู้ดูแลระบบเผยแพร่ลายนิ้วมือ SSH ของเซิร์ฟเวอร์บนอินทราเน็ตของบริษัทหรือในอีเมลที่ลงนาม คุณสามารถตรวจสอบได้ว่าตรงกับข้อความแจ้งที่คุณได้รับเมื่อเชื่อมต่อ หากลายนิ้วมือไม่ตรงกัน คุณสามารถปฏิเสธการเชื่อมต่อได้อย่างมั่นใจเนื่องจากมีผู้ขัดขวางการรับส่งข้อมูลของคุณหรือรหัสเซิร์ฟเวอร์มีการเปลี่ยนแปลง หากลายนิ้วมือตรงกัน คุณจะรู้ว่าคุณมีกุญแจที่ถูกต้อง คีย์นั้นเป็นของเซิร์ฟเวอร์ที่ถูกต้องหรือไม่นั้นเป็นคำถามแยกต่างหาก คำถามที่คุณสามารถตอบได้โดยการตรวจสอบช่องทางการเผยแพร่ (หน้าอินทราเน็ตดูถูกต้องหรือไม่ อีเมลมาจากบัญชีของผู้ดูแลระบบจริงหรือไม่)
ตัวอย่างการทำงาน — การตรวจสอบลายนิ้วมือกับลายนิ้วมือที่เผยแพร่ผ่านช่องทางที่เชื่อถือได้ทีละขั้นตอน
ลายนิ้วมือของใบรับรองมีจุดประสงค์เดียวกัน คือ ระบุใบรับรองเฉพาะเจาะจงโดยไม่ซ้ำกัน หากเซิร์ฟเวอร์ TLS เปลี่ยนใบรับรอง (เช่น ระหว่างการต่ออายุ) ใบรับรองใหม่จะมีลายนิ้วมือที่แตกต่างกัน การปักหมุดใบรับรอง—ฮาร์ดโค้ดลายนิ้วมือหรือชุดลายนิ้วมือเล็กๆ ที่ยอมรับได้ในแอปพลิเคชัน—เป็นเทคนิคความปลอดภัยในการตรวจจับการเปลี่ยนแปลงใบรับรอง หากเซิร์ฟเวอร์แสดงใบรับรองด้วยลายนิ้วมืออื่น แอปพลิเคชันจะปฏิเสธ วิธีนี้จะช่วยป้องกัน CA ที่ถูกบุกรุกซึ่งออกใบรับรองการฉ้อโกงที่เบราว์เซอร์อาจเชื่อถือ
การปักหมุดใบรับรองจำเป็นต้องมีการจัดการอย่างรอบคอบ: หากเซิร์ฟเวอร์อัปเดตใบรับรองและคุณไม่ได้คาดหวังไว้ แอปพลิเคชันของคุณจะปฏิเสธใบรับรองใหม่ที่ถูกต้อง แอปพลิเคชันจำนวนมากใช้การปักหมุดคีย์สาธารณะแทน ซึ่งจะปักหมุดคีย์สาธารณะแทนใบรับรองทั้งหมด ซึ่งช่วยให้สามารถต่ออายุใบรับรองโดยไม่มีการปฏิเสธตราบใดที่ใช้คีย์เดียวกัน
ตัวอย่างการทำงาน: ตรวจสอบด้วยเครื่องมือที่รับรู้โปรโตคอลเนื่องจาก ToolAcre แฮชวางข้อความ UTF-8 ไม่ใช่ DER หรือ SSH ไบต์แบบลวด
การคำนวณลายนิ้วมือด้วยตนเองเพื่อการตรวจสอบทำได้ง่ายตรงไปตรงมา บันทึกใบรับรองหรือคีย์ลงในไฟล์ ใช้ `openssl dgst -sha256 filename` หรือ `ssh-keygen -l -f filename -E sha256` เพื่อแสดงลายนิ้วมือ และเปรียบเทียบกับลายนิ้วมือที่เซิร์ฟเวอร์แสดงให้คุณเห็น เครื่องคำนวณแฮช ToolAcre SHA ยังสามารถคำนวณการแยกย่อยได้หากคุณวางคีย์ไบต์ แต่โปรดจำไว้ว่าเครื่องคิดเลขจะแฮช UTF-8 ข้อความที่คุณวาง ไม่ใช่ไฟล์ไบนารี หากคีย์อยู่ในรูปแบบ PEM (ข้อความที่มีส่วนหัว `-----BEGIN CERTIFICATE-----` และไบต์ที่เข้ารหัส base64) คุณสามารถวางคีย์ลงในเครื่องคิดเลขได้ หากอยู่ในรูปแบบ DER (ไบนารี) คุณต้องใช้เครื่องมือบรรทัดคำสั่งหรือแปลงเป็น PEM ก่อน
ขอบเขตเป็นสิ่งสำคัญ: ToolAcre แฮช UTF-8 ข้อความที่คุณวางในอินเทอร์เฟซเครื่องคิดเลข มันไม่อ่านไฟล์จากอุปกรณ์ของคุณ (การคำนวณทั้งหมดอยู่ในเบราว์เซอร์ ในแท็บของคุณ โดยไม่มีเครือข่าย) หากคุณมีไฟล์คีย์บนดิสก์ คุณสามารถเปิดไฟล์นั้นในตัวแก้ไขข้อความ คัดลอกข้อความและวางลงในเครื่องคิดเลขหากอยู่ในรูปแบบ PEM หรือคุณสามารถใช้เครื่องมือบรรทัดคำสั่งเช่น `openssl`, `ssh-keygen` หรือ `sha256sum` เพื่อคำนวณแฮชในเครื่อง
ประเด็นสำคัญ: เปรียบเทียบลายนิ้วมือนอกย่านความถี่ — เครื่องคำนวณแฮช ToolAcre SHA แสดงให้เห็นว่า SHA-1 และ SHA-256 ย่อยมีลักษณะอย่างไรตามความยาวที่ลายนิ้วมือใช้
เครื่องคำนวณแฮช ToolAcre SHA จะแสดง SHA-1 และ SHA-256 ย่อยสำหรับการป้อนข้อความใดๆ หากคุณวางใบรับรองในรูปแบบ PEM หรือคีย์สาธารณะ SSH เครื่องคิดเลขจะคำนวณทั้งสองส่วนย่อย สำหรับปุ่ม SSH เครื่องคิดเลขจะแฮชข้อความที่คุณวาง หากคุณวางรูปแบบคีย์สาธารณะ SSH ที่เข้ารหัส base64 มาตรฐาน การสรุปข้อมูลจะไม่ตรงกับลายนิ้วมือ SSH เนื่องจาก SSH ใช้การจัดรูปแบบของตัวเอง (รูปแบบเส้นลวด) ก่อนที่จะแฮช สำหรับการจับคู่โดยตรง คุณต้องมีคีย์ในรูปแบบที่ SSH ใช้ภายในทุกประการ ซึ่งไม่ใช่รูปแบบที่แสดงต่อสาธารณะ
สำหรับลายนิ้วมือใบรับรอง ลักษณะการทำงานจะคล้ายกัน: หากคุณวางข้อความใบรับรองที่เข้ารหัส PEM เครื่องคิดเลขจะแฮชข้อความนั้น ลายนิ้วมือของใบรับรองจะคำนวณโดยใช้ไบต์ของใบรับรองที่เข้ารหัส (รูปแบบ DER) ไม่ใช่ตัวตัดข้อความ PEM ไบต์เหมือนกัน แต่การเข้ารหัสข้อความต่างกัน หากต้องการจับคู่ลายนิ้วมือใบรับรองจาก OpenSSL หรือโปรแกรมดูใบรับรองของเบราว์เซอร์ คุณจะต้องระบุไบต์ DER ซึ่งมนุษย์ไม่สามารถอ่านได้ จุดประสงค์ของเครื่องคิดเลขคือการแฮชข้อความ UTF-8 ที่คุณสามารถวางและอ่านได้ ทำให้ขอบเขตชัดเจน: แฮชการป้อนข้อความ ไม่ใช่ไฟล์คีย์การเข้ารหัสในรูปแบบไบนารี่มาตรฐานหรือรูปแบบโปรโตคอลแบบลวด