กระบวนการเข้ารหัสที่สำคัญอย่างแบบกุญแจสมมาตร (symmetic key encryption) ในตอนที่แล้วแม้จะสามารถป้องกันการดักฟังได้อย่างมีประสิทธิภาพ แต่ข้อจำกัดคือทั้งสองฝ่ายต้องรับรู้ “ความลับ” ร่วมกัน และข้อจำกัดที่สำคัญมากคือ ผู้ที่รู้ความลับนี้ทุกคนจะเข้าไปอ่านข้อความได้ทั้งหมด
การใช้งานในอินเทอร์เน็ตนั้นต่างออกไป ส่วนมากเรามักจะรับรู้ว่าเราต้องการติดต่อกับใคร เช่น เราต้องการเข้าเว็บไซต์ซักเว็บและเราต้องการแน่ใจว่าเว็บนั้นเป็นเว็บที่เราตั้งใจจะเข้าใช้งานจริง ต้องไม่มีใครปลอมตัวเป็นเว็บนั้นได้ หรือไม่มีใครอ่านข้อความที่เรากับเว็บนั้นๆ สื่อสารถึงกันได้ กระบวนการเข้ารหัสแบบกุญแจไม่สมมาตร (asymmetric key encryption) เป็นกระบวนการเข้ารหัสที่เปิดให้ผู้ส่งข้อมูลกับผู้รับข้อมูลสามารถใช้กุญแจคนละชุดกัน ที่สร้างมาคู่กันโดยเฉพาะ แล้วสร้างการเชื่อมต่อที่เข้ารหัสถึงกันได้
Diffie–Hellman (DH) เป็นกระบวนการสร้าง “ความลับ” ระหว่างกันโดยไม่ต้องส่งความลับนั้นถึงกันจริงๆ โดยทั่วไปแล้วความลับที่ว่าคือการแลก “กุญแจ” สำหรับการเข้ารหัสแบบกุญแจสมมาตรเพื่อส่งข้อมูลถึงกันต่อไป กระบวนการ DH นี้ไม่สามารถเข้ารหัสโดยตัวมันเองได้ เพียงแต่บอกกระบวนการสร้างความลับร่วมกันเท่านั้น
การอธิบายกระบวนการ DH นั้นอาศัยความจริงที่ว่า (n^a)^b mod p = (n^b)^a mod p เมื่อเราใช้ค่า (n^a)^b mod p นี้เป็นค่ากุญแจสำหรับการเข้ารหัสแบบกุญแจสมมาตร เราสามารถแลกค่า n และ p อย่างเปิดเผยได้ โดย a และ b เป็นความลับที่แต่ละฝ่ายต้องเก็บไว้กับตัว สิ่งที่แต่ละฝ่ายส่งให้กันคือค่า n^a mod p และ n^b mod p เมื่ออีกฝ่ายนำไปยกกำลังกับความลับของตัวเองก็จะได้ตัวเลขชุดที่เหมือนกันทั้งสองฝั่ง หากแฮกเกอร์ไม่รู้ทั้งค่าความลับของทั้งสองฝั่ง ก็ไม่สามารถถอดรหัสได้
กระบวนการ DH ยังคงได้รับความนิยมอยู่จนทุกวันนี้ในการแลกกุญแจการเชื่อมต่อ แต่โดยตัวกระบวนการ DH เองไม่มีการยืนยันว่าฝ่ายตรงข้ามเป็นคนที่เราต้องการพูดคุยด้วยจริงหรือไม่ เราเรียกการเชื่อมต่อแบบ DH ที่ไม่มีการยืนยันตัวตนนี้ว่า Anonymous DH (ADH) กระบวนการนี้แม้จะทนทานต่อการดักฟัง แต่หากมีคนร้ายปลอมตัวเป็นฝ่ายตรงข้ามที่เราต้องการคุยด้วย (การโจมตีแบบ man-in-the-middle) โดยคนร้ายเชื่อมต่อกับเราด้วยกระบวนการ DH และเชื่อมต่อกับปลายทางด้วย DH เหมือนกันก็จะดักทุกอย่างได้ทันที
เราสามารถสร้างเซิร์ฟเวอร์แบบ ADH ได้ง่ายๆ ด้วยการใช้ OpenSSL ที่มีติดตั้งอยู่ในลินุกซ์ส่วนมาก ด้วยคำสั่ง openssl s_server -nocert -cipher aNULL
ในฝั่งเซิร์ฟเวอร์ และ openssl s_client -cipher aNULL
ในฝั่งไคลเอนต์ ก็สามารถเชื่อมต่อแบบเข้ารหัสได้ทันที โดยที่การเข้ารหัสแบบกุญแจสมมาตรนั้นจะมีการเลือกให้โดยอัตโนมัติ ขึ้นกับเวอร์ชั่นของ OpenSSL ที่ใช้งานนั้นซัพพอร์ตกระบวนการใดบ้าง
กระบวนการเข้ารหัสที่ดังที่สุดอันหนึ่งของโลกคงเป็น RSA ที่ยังเป็นชื่อของบริษัทขายสินค้าความปลอดภัยชื่อดังในตัว (ปัจจุบัน RSA เป็นบริษัทในเครือ EMC) RSA ต่างจากกระบวนการ DH เพราะมันเป็นกระบวนการ “เข้ารหัส” อย่างเต็มรูปแบบ โดยไม่ต้องการกระบวนการเข้ารหัสอื่นๆ มาเสริมอีก เราสามารถเข้ารหัสไฟล์ข้อมูลขนาดใหญ่ด้วยกระบวนการ RSA ได้ แม้จะไม่เป็นที่นิยมนักเพราะกระบวนการกินพลังประมวลผลสูง
กระบวนการ RSA เริ่มจากการสุ่มเลขจำนวนเฉพาะขนาดใหญ่สองตัวเพื่อสร้างกุญแจที่เป็นคู่กันและกันแล้วสร้างเป็นกุญแจคู่หนึ่ง ที่จะถอดรหัสได้จากคู่ของมันเท่านั้น กระบวนการแบบนี้ทำให้ในการใช้งานจริง เรามัก “แจก” กุญแจฝั่งหนึ่งให้ทั่วโลกได้เห็น แล้วเรียกมันว่ากุญแจสาธารณะ จากนั้นจึงเก็บอีกฝั่งหนึ่งไว้เป็นความลับกับตัวเราเอง ในกระบวนการเข้ารหัสการเชื่อมต่อ ที่เราต้องการใช้กุญแจสมมาตร เราอาจจะให้ฝั่งใดฝั่งหนึ่ง สร้างกุญแจขึ้นมาด้วยกระบวนการสุ่ม แล้วส่งให้กับอีกฝ่ายหนึ่งด้วยการเข้ารหัสกุญแจด้วยกระบวนการ RSA โดยใช้กุญแจสาธารณะของอีกฝ่าย ซึ่งจะทำให้มีเพียงเจ้าของกุญแจเท่านั้นที่อ่านได้
กระบวนการยืนยันความถูกต้องของเอกสารนั้นมีความสำคัญเป็นอย่างยิ่งในโลกออนไลน์ หลายครั้งที่เราไม่ต้องการปิดบังความลับในเอกสารแต่อย่างใด แต่เราต้องการยืนยันว่าเอกสารนั้นมาจากเราจริง
กระบวนการเซ็นดิจิตอลสามารถทำได้ด้วยกระบวนการ RSA โดยใช้กุญแจลับมาเข้ารหัสค่าแฮชของเอกสารแล้วแนบค่าแฮชนั้นติดไปกับเอกสาร เมื่อผู้รับสารได้รับ ก็สามารถแฮชเอกสารจนได้ค่าแฮชมาแล้วถอดรหัสลายเซ็นดิจิตอลด้วกุญแจสาธารณะของผู้ลงลายเซ็นแล้วดูว่าค่าแฮชนั้นตรงกันหรือไม่ ถ้าตรงกันก็แสดงว่าลายเซ็นถูกต้อง
คำถามสุดท้ายในระบบกุญแจสาธารณะคือเราจะรู้ได้อย่างไรว่ากุญแจสาธารณะที่เราได้มานั้นเป็นของใคร แม้ในไฟล์กุญแจอาจจะแจ้งที่มาของตัวเอง แต่เราจะรู้ได้อย่างไรว่าเจ้าของกุญแจนั้นเป็นตัวจริง
ระบบโครงสร้างพื้นฐานกุญแจสาธารณะ ระบุให้เราต้องมีหน่วยงานที่รู้จักตั้งแต่แรกอยู่ในเครื่องของเราเสียก่อนเรียกว่าหน่วยงานออกใบรับรอง (Certification Authority - CA) หน่วยงานเหล่านี้มักทำงานร่วมกับผู้ผลิตระบบปฎิบัติการ, ผู้ผลิตเบราว์เซอร์, หรือแม้แต่ผู้ผลิตไลบรารีความปลอดภัย เพื่อยืนยันว่าหน่วยงานของตัวเองมีความปลอดภัยอย่างเพียงพอ มีกระบวนการตรวจสอบผู้ที่จะมาขอให้รับรองกุญแจสาธารณะของตัวเองได้อย่างครบถ้วน เมื่อผ่านกระบวนการตรวจสอบในระดับหนึ่งแล้ว ผู้ผลิตซอฟต์แวร์ก็จะรวมเอากุญแจสาธารณะของหน่วยงานเหล่านี้เข้าไว้ในซอฟต์แวร์ของตัวเอง (ตัวอย่างรายชื่อหน่วยงานที่ Mozilla/Firefox รวมกุญแจสาธารณะไว้)
สำหรับผู้อื่นที่ต้องการใช้มีการรับรองกุญแจสาธารณะของตัวเอง ต้องสร้างกุญแจสาธารณะขึ้นมาในเครื่องของตัวเองเป็นไฟล์ที่เรียกว่าไฟล์ CSR (Certificate Signing Request) แล้วส่งไปยังหน่วยงานที่ได้รับการรับรองเหล่านี้ จากนั้นหน่วยงานเหล่านี้จะมีการยืนยันตัวตน เช่น การส่งอีเมลมาขอยืนยัน, หรือกระทั่งการขอเอกสารทางราชการในบางกรณี เมื่อยืนยันตามกระบวนการแล้วหน่วยงานเหล่านี้จะใช้กุญแจลับของตนเองเซ็นลายเซ็นดิจิตอล ซึ่งก็คือค่าแฮชของข้อมูลในไฟล์ CSR แล้วเข้ารหัส แล้วส่งกลับมายังผู้ร้องขอเป็นไฟล์รับรอง (Certificate - CRT)
ในระบบการรับรองนั้นหน่วยงานที่ทำงานร่วมกับผู้ผลิตซอฟต์แวร์จริงมักมีน้อยไม่เกินหนึ่งร้อยราย และกระบวนการติดต่อเพื่อขอรับรองจะใช้เวลานานและเงินทุนที่สูงมาก แต่หน่วยงานที่ได้รับความเชื่อถือจากซอฟต์แวร์เหล่านี้แล้วมีสิทธิที่จะรับรองหน่วยงานรับรองอื่นๆ เรียกว่าเป็นหน่วยงานขั้นกลาง (Intermediate CA) เพื่อไปรับรองใบรับรองจริงๆ ต่อไป โดยที่ซอฟต์แวร์เช่นเบราว์เซอร์ จะไล่ดูว่าสุดท้ายแล้วหน่วยงานสุดท้ายที่รับรองกุญแจมานั้นอยู่ในรายชื่อของหน่วยงานที่เชื่อถือหรือไม่ ถ้าเชื่อถือก็จะให้ผู้ใช้เข้าใช้งาน แต่ถ้าไม่เชื่อถือก็จะขึ้นหน้าจอแจ้งเตือนผู้ใช้
เราสามารถสร้างไฟล์รับรองขึ้นมาเองได้โดยไม่ต้องไปขอหน่วยงานอื่นให้เซ็นแต่อย่างใด ไฟล์ประเภทนั้นเรียกว่าไฟล์รับรองตนเอง (Self Signed Certificate) ซึ่งเบราว์เซอร์จะขึ้นเตือนเมื่อใช้งานเสมอ
ข่าวการรั่วไหลของระบบเครือข่ายของบริษัทให้บริการรับรองกุญแจสาธารณะ ทำให้หน่วยงานเหล่านี้เก็บรักษากุญแจลับของตัวเองหนาแน่นขึ้น ไม่ยอมให้ซอฟต์แวร์ต่างๆ เข้าถึงกุญแจลับได้โดยตรงอีกต่อไป วิธีการคือให้กุญแจลับเซ็นกุญแจสาธารณะของหน่วยงานขั้นกลางขึ้นมาอีกชั้น แล้วนำกุญแจลับของหน่วยงานขั้นกลางนี้ให้บริการอยู่ในคอมพิวเตอร์อัตโนมัติ หากระบบรั่วไหลจริง ก็สามารถยกเลิกหน่วยงานขั้นกลางนี้ไปแล้วแจ้งให้ซอฟต์แวร์ทั้งหมดยกเลิกความเชื่อถือหน่วยงานขั้นกลางนั้นไป ทุกวันนี้เวลาที่เราส่งไฟล์ CSR ไปยังหน่วยงานเหล่านี้เราจะได้รับไฟล์ CRT กลับคืนมาพร้อมกับไฟล์รับรองของหน่วยงานขั้นกลางนี้มาพร้อมกัน
กระบวนการรับรองนี้สามารถรับรองได้หลายอย่าง นับแต่ชื่อโดเมนที่เราใช้กันโดยทั่วไป, อีเมลที่เราสามารถยืนยันได้ว่าเนื้อหาในอีเมลมาจากเราจริง, ไปจนถึงระบบสมาร์ตการ์ด
การยืนยันอีเมลนั้นหน่วยงานให้ไฟล์รับรองออกมาเป็นไฟล์ที่เรัยกว่า PKCS #12 ไฟล์นี้สามารถรวมเข้าไว้ในเบราว์เซอร์ของเราเพื่อใช้ยืนยันว่าเราเป็นเจ้าของอีเมลที่มีอยู่ในใบรับรองได้ เราสามารถใช้ข้อมูลจากไฟล์รับรองนี้ส่งให้เว็บต่างๆ เพื่อใช้ล็อกอินอย่างปลอดภัยโดยไม่ต้องจำรหัสผ่านได้ แม้จะออกแบบมาเป็นอย่างดี แต่ในความเป็นจริงระบบนี้ก็ไม่ได้รับความนิยมนักเพราะใช้งานค่อนข้างยุ่งยาก
ในระบบสมาร์ตการ์ด มีมาตรฐานที่เรียกว่า PKCS #11 ออกแบบให้สมาร์ตการ์ดเป็นที่เก็บกุญแจลับของเรา สมาร์ตการ์ดจะมีทั้งกุญแจลับและกุญแจสาธารณะที่ได้รับการรับรองจนเป็นไฟล์รับรองอยู่ในตัว เมื่อเราต้องการทำธุรกรรม เช่นการโอนเงิน เครื่องที่คอมพิวเตอร์ที่เราเสียบสมาร์ตการ์ดจะดาวน์โหลดไฟล์รับรองเพื่อตรวจสอบว่าเราได้รับการรับรองจากหน่วยงาน (เช่นกระทรวงมหาดไท ในกรณีบัตรประชาชน) จริงหรือไม่ เมื่อตรวจสอบแล้วถูกต้องจึงส่งค่าแฮชของไฟล์ข้อมูลที่เราจะกระทำ เช่นไฟล์ข้อมูลโอนเงิน เข้าไปยังสมาร์ตการ์ดเพื่อเข้ารหัสค่าแฮชออกมาเป็นลายเซ็นดิจิตอล การใช้สมาร์ตการ์ดมีข้อดีหลายข้อ คือกุญแจลับเป็นบัตรนั้นเก็บรักษาได้ง่าย และทำสำเนายากกว่า สมาร์ตการ์ดบางรุ่นต้องใส่รหัสผ่านสี่หลักเสมอ และจะทำลายกุญแจลับทันทีที่ใส่รหัสผิดครบจำนวนครั้งที่กำหนด ในโลกความเป็นจริง กุญแจลับของหน่วยงานออกใบรับรองนั้นก็มักเก็บรักษาเป็นสมาร์ตการ์ด โดยต้องมีเก็บใบสำเนาแยกไว้ และรักษาความปลอดภัยไว้เท่าเทียมกัน (เคยมีกรณีที่หน่วยงานเลินเล่อ ไม่สำรองบัตรแล้วทำกุญแจลับหายก็มีมาแล้ว แต่เป็นช่วงทดสอบโครงการ)
ทุกวันนี้บัตรสมาร์ตการ์ดสำหรับการจ่ายเงินมักเป็นบัตร EMV (Europay, MasterCard and Visa) ซึ่งแม้จะมีฟอร์แมตและ API ของบัตรต่างจากกระบวนการ PKI ใน PKCS #11 แต่หลักการก็ยังคงคล้ายกันคือการเซ็นใบรับรองต้องมาจากเจ้าของเครือข่ายอย่าง VISA ซึ่งจะใช้ใบรับรองขั้นกลางเซ็นใบรับรองให้กับหน่วยงานออกบัตร เช่น ธนาคาร เพื่อมารับรองบัตรเครดิตอีกที และบัตรจะยืนยันกระบวนการต่างๆ เช่น การจ่ายเงิน ได้ว่ามีการจ่ายเงินจริงด้วยบัตรตัวจริงหรือไม่
Comments
มีใครเคยเสนอชื่อชุดบทความนี้ยังเนี่ย ^^ /me ส่งเข้าประกวด
ฮาฮา ป.ล. ยังไม่ได้อ่าน เลยยังไม่มี spellcheck นะครับ :P
@ Virusfowl
I'm not a dev. not yet a user.
[ต่างใจเดียว]
/me เปิดละอองฟองนั่งฟัง
เป็นไฟล์ที่เรัยกว่า/เป็นไฟล์ที่เรียกว่า
น่าจะลิงค์ไปยังบทความก่อนด้วยครับ
*Symmetic -> Symmetric
ด้ว => ด้วย
เข้าใจว่าการเข้ารหัสแบบ Asymetric น่าจะทนต่อการ Brute Force Hash ของรหัสผ่านที่ถูก Salt ด้วยวิธีการนี้
ถ้าจะถอดแบบนั้น สู้หลอกเอาลูกกุนแจง่ายกว่าครับ ผมใช้ ec2 ต้องถือกุนแจไปด้วย หากหลุดไปก็จบ 555
ด้วย ตกยักไปครับ
เรียก พิมพ์สระอีพลาดเป็นไม้หันครับ
มหาดไท > มหาดไทย
@ Virusfowl
I'm not a dev. not yet a user.
พอดีผมดูบนมือถืออยากดูบทความแนวนี้ที่ผ่านๆมาได้จากหัวข้อไหนครับ
ง่ายที่สุดน่าจะเป็นที่แท็ก in-depth ครับ
ซัก -> สัก