Saladpuk.com
🏆 เนื้อหาหลัก
🏆 เนื้อหาหลัก
  • 💖สลัดผัก
  • 📰มีอะไรใหม่บ้าง
    • 2020
      • 2020-11
      • 2020-10
      • 2020-09
      • 2020-08
      • 2020-03
      • 2020-02
      • 2020-01
    • 2019
      • 2019-12
      • 2019-11
      • 2019-10
      • 2019-09
      • 2019-08
  • 🤔อ่านเรื่องไรดี ?
  • มือใหม่หัดเขียนโค้ด
    • 👶เขียนโค้ดด้วยภาษา C#
      • เกิดมาไม่เคยเขียนโค้ดมาก่อนเบย
      • 👶พื้นฐาน
        • 1.โปรแกรมที่ต้องลง
        • 2.โครงสร้างของโค้ด
        • 3.ชนิดของข้อมูล
        • 4.การสร้างตัวแปร
        • 5.คำสั่งพื้นฐาน
        • 6.การแปลงข้อมูล
        • 7.การเปรียบเทียบค่า
        • 8.การตัดสินใจด้วย IF statements
        • 9.การตัดสินใจด้วย Switch statements
        • 10.การทำงานซ้ำๆด้วย While
        • 11.การทำงานซ้ำๆด้วย Do While
        • 12.การทำงานซ้ำๆด้วย For
        • 13.การแก้โจทย์จากรูป
        • 14.มารู้จักกับ Array กัน
      • 🧑ระดับกลาง
        • 15.Value type vs Reference type
        • 16.ลดงานซ้ำๆด้วย Method
        • 17.มารู้จักกับ Class & Field กัน
        • 18.มารู้จักกับ Constructor กันบ้าง
        • 19.มาเขียน Method ใน Class กัน
        • 20.มารู้จักกับ Property กัน
        • 21.ลองใช้คลาสแบบจริงจังบ้าง
        • 22.การสืบทอด Inheritance
        • 23.Polymorphism
        • 24.Abstract Class
        • 25.Interface
        • 26.Namespace
        • 27.Enum
        • 28.Exception handler
        • 29.ลงลึกกับ string
        • 30.StringBuilder เพื่อนคู่ string
      • 👨⏳ระดับสูง
        • Generic
        • Delegates
        • Action & Func
        • Lambda expression
        • LINQ
        • พระคัมภีร์การใช้คำสั่ง LINQ
      • 💡Tips
        • 💡C# version 8.0
        • 💡Boxing & Unboxing
    • 👶Algorithm
      • 👾Algorithm Big-O
      • 👽Algorithm P & NP
    • 👦OOP
      • 💖Abstraction
      • 💖Encapsulation
      • 🏆Abstraction & Encapsulation
      • 💖Inheritance
      • 💖Polymorphism
      • 🏆Inheritance & Polymorphism
      • 📝ลองเขียน OOP ดูดิ๊
      • 👑OOP + Power of Design
      • 🥰เทคนิคในการออกแบบ
    • 👶บทสรุปฐานข้อมูล
      • เก็บรูปในฐานข้อมูล
      • Database indexing
      • การลบข้อมูล
    • 👦Communication Patterns
    • 👦Design Patterns
      • 🤰Creational Patterns
        • 🏭Factory Method
        • 🏭Abstract Factory
        • ☝️ Singleton Pattern
        • 🏗️ Builder Pattern
        • 🎎Prototype Pattern
      • 🧱Structural Patterns
        • 🔌Adapter Pattern
        • 📪Proxy Pattern
  • Puzzle
    • 🧠Challenges
      • 🐴Google ม้า 25 ตัว
      • 🌉Amazon เสา 2 ต้น
      • 🥇ทองเก๊
      • 💊ยาต้านโควิด
      • 🎩CP หมวก 5 ใบ
      • 🧓Einstein's Riddle 01
  • พื้นฐานที่ควรต้องรู้
    • 🐳Docker
      • 📦Docker Containers
      • 🃏Docker Exercise 01
      • 🛠️ Docker Tools
      • 🗃️ Docker Registry
      • 🖼️ Container Image
      • 📢Docker Push
      • 🔄WSL
    • 👶Clean Code
      • 🧓Uncle Bob - Clean Code
      • 🧓Uncle Bob - Comments
      • 🧓Uncle Bob - Naming
      • 🧓Uncle Bob - Mindset
      • 🧓Uncle Bob - TDD
    • 👶Code Smells
    • 👶สิ่งที่คนเขียนโค้ดมักเข้าใจผิด
    • 👶AI พื้นฐาน
    • 👶Git พื้นฐาน
      • Git branching strategy
    • 👶Cloud พื้นฐาน
    • 👶UML พื้นฐาน
      • Activity Diagram
      • Class Diagram
      • Sequence Diagram
      • Use case Diagram
      • บทสรุปการใช้ UML
    • 👶Data Scientist
      • การเลือก Algorithms ให้ AI (1/5)
      • การเตรียมข้อมูลให้ AI (2/5)
      • หลักการตั้งคำถามให้ AI (3/5)
      • แฉความลับของ AI Model (4/5)
      • หัดเขียน AI จาก AI ของคนอื่น (5/5)
    • 👶DevOps พื้นฐาน
    • 👶Docker ขั้นพื้นฐาน
      • Image and Container
      • แชร์ Docker Image ที่สร้างไว้
    • 👶Microservices พื้นฐาน
      • Microservices ที่ดีมีลักษณะยังไง
      • Microservices Tips
      • จาก Monolith สู่ Microservices
    • 👶ความรู้พื้นฐานในการทำเว็บ
    • 👦Bottlenecks of Software
      • หัวใจที่สำคัญที่สุดของฐานข้อมูล
    • 👦Agile Methodology
      • Agile in a Nutshell
      • Software Development Life Cycle
      • Code Review
    • 👦Security พื้นฐาน
      • การเก็บรหัสผ่านที่ถูกต้อง
      • Security in actions
        • Hash function
      • Security Principles
      • 😎The Matrix 1
      • 😎The Matrix 2
      • HTTPS in a nutshell
    • 👦SOLID Design Principles
      • มารู้จักกับ SOLID กันดีกว่า
      • Single-Responsibility Principle
      • Open/Closed Principle
      • Liskov Substitution Principle
      • Interface Segregation Principle
      • Dependency-Inversion Principle
  • Cloud Computing
    • 👶Microsoft Azure 101
      • สมัคร Microsoft Azure
      • รู้จักกับ Resource Groups
      • สร้างเว็บตัวแรกกัน
      • สร้าง Virtual Machine กัน
      • ประเภทของคลาว์เซอร์วิส
      • มาสร้าง Logic App กัน
      • มาสร้าง Function App กัน
      • คลาว์คิดเงินยังไง ?
      • Cloud Native
      • Guideline for Cloud scaling
      • Auto Scaling
    • 👶Azure App Services
    • 👶App Service Plan
    • 👶Azure Storage
      • Blob storage
        • ลองสร้างที่เก็บไฟล์กันเลย
        • เข้าใจ Blob storage ให้มากขึ้น
        • ลองเขียนโค้ดอัพโหลดไฟล์กันบ้าง
        • สร้างเว็บจากที่ฝากไฟล์บนคลาว์
    • 👶Azure Bot Service
      • Bot เข้าใจเราได้ยังไงกันนะ
    • 👶Azure Cognitive Services
      • การสร้าง Cognitive Services
      • การ Login ด้วยใบหน้า
      • อ่านลายมือจากรูปเป็นตัวอักษร (OCR)
      • เขียน AI แยกของต่างๆทำยังไง?
      • เขียนแอพ ทายอายุ บอกเพศ ง่ายจิ๊ดเดียว
      • เขียนแอพให้ AI อธิบายรูปเป็นภาษาคน
    • 👶Machine Learning Studio
      • มาสร้าง AI ของแท้ตัวแรกของเรากัน
      • สร้าง AI ตัดสินใจอนุมัติบัตรเครดิต 💳
      • ลองเรียกใช้ AI ของเรากัน
    • 👶Azure Service Fabric
      • สร้าง Service Fabric กัน
    • 👶Blockchain
      • Blockchain ทำงานยังไง ?
      • Consensus Algorithm คืออะไร ?
      • สร้าง Blockchain ใช้เองกัน !
      • หัดเขียน Smart Contract กัน
    • 👶Power BI
    • 👶Azure Web App
      • เซิฟเวอร์บนคลาว์ ราคา? ต่าง?
    • 👶Azure DevOps
      • เล่น Azure DevOps กัน
      • เล่นกับ Repository
      • ลองทำ Continuous Integration (CI)
      • ลองทำ Continuous Delivery (CD)
      • เล่น Kanban Board
    • 🤠Cloud Playground
      • การป้องกันความลับหลุดตอนที่ 1
      • การป้องกันความลับหลุดตอนที่ 2
      • การป้องกันความลับหลุดตอนที่ 3
      • การป้องกันความลับหลุดตอนจบ
  • Software Testing
    • 👦Test-First Design
    • 👦Test-Driven Development
      • 1.มารู้จักกับ TDD กันดีกว่า
      • 2.Test cases เขาเขียนกันยังไงนะ
      • 3.เครื่องมือในการทดสอบ
      • 4.การใช้ Theory และ InlineData
      • 5.โค้ดที่ทดสอบได้
      • 6.Mantra of TDD
      • 7.Functional & None-Functional testing
      • 8.Manual vs Automation testing
      • 9.Automation Frameworks in .NET
      • 10.Mock Framework
      • 11.มาเรียนการใช้ Moq กันเถอะ
      • 12.สรุป
  • Web
    • 👦Web API
      • 1.Web API คืออะไร
      • 2.ติดตั้ง .NET Core SDK
      • 3.สร้าง Web API ตัวแรกกัน
      • 4.Verbs
      • 5.Swagger เพื่อคู่ API
      • 6.การใช้ Model
      • 7.เรียก Web API ผ่าน Postman
      • 8.มาจัดกลุ่ม API กัน (1/2)
      • 9.มาจัดกลุ่ม API กัน (2/2)
  • Software Design
    • 🤴Design Patterns
      • 🦈Creational patterns
        • Abstract Factory
        • Builder
        • Factory Method
        • Prototype
        • Singleton
      • 🦈Structural patterns
        • Adapter
        • Bridge
        • Decorator
        • Facade
        • Proxy
      • 🦈Behavioral patterns
        • Chain of Responsibility
        • Command
        • Iterator
        • Mediator
        • Memento
        • Observer
        • State
        • Strategy
        • Template Method
        • Visitor
Powered by GitBook
On this page
  • 😥 ปัญหา
  • 😄 วิธีแก้ปัญหา
  • 🔥 Http vs Https
  • 🔐 SSL/TLS
  • 🤫 กุญแจลับ
  • 🔑 Symmetric Key
  • 🔑 Asymmetric Key
  • 🤔 TLS ทำงานไง?
  • 🗃️ Certificate Authority
  • 😷 จุดอ่อน
  • 📜 X.509 PKI
  • 🤝 Pre-Handshake
  • 💣 Client-Side
  • 🎯 บทสรุป

Was this helpful?

Export as PDF
  1. พื้นฐานที่ควรต้องรู้
  2. Security พื้นฐาน

HTTPS in a nutshell

🤔 ไม่ได้ปลอดภัยเหมือนที่เราคิด อธิบายหมดเปลือกแบบภาษาชาวบ้าน

PreviousThe Matrix 2NextSOLID Design Principles

Last updated 4 years ago

Was this helpful?

😥 ปัญหา

เวลาที่เราเข้าเว็บอะไรก็ตามที่ต้องใส่ ข้อมูลบัตรเครดิต หรือ ข้อมูลที่เราไม่อยากให้ใครรู้ เราจะมั่นใจได้ไงว่า ข้อมูลของเราโดนส่งให้คนรับถูกคน? และ ไม่มีคนอื่นแอบอ่านข้อมูลลับของเราอยู่?

แนะนำให้อ่าน บทความนี้เป็นส่วนหนึ่งของคอร์ส ถ้าเพื่อนๆสนใจอยากรู้หลักในการรักษาความปลอดภัยตั้งแต่เริ่มต้นเลย ก็กดอ่านที่ตัวสีฟ้าๆได้เลยนะ

ในวงการคอมพิวเตอร์การที่ คอม 2 เครื่องจะคุยกันแบบปลอดภัยจริงๆนั้นทำได้ยาก เพราะตัวระบบต่างๆย่อมมีช่องโหว่อยู่เสมอ ทำให้คนร้ายใช้ช่องโหว่เหล่านั้นเข้ามาโจมตีได้ตลอดเวลา เช่น แอบอ่านข้อมูลระหว่างทาง หรือ ปลอมตัวเป็นผู้รับเสียเอง ตามรูปด้านล่าง

แอบอ่านระหว่างทาง ทำให้คนร้ายเห็นความลับทุกอย่างที่ส่งออกไป เช่น ข้อมูลบัตรเครดิต รหัสผ่าน รหัสประชาชน หรืออะไรก็ตามแต่ที่เราไม่อยากให้เขารู้

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

😄 วิธีแก้ปัญหา

ปัญหาเกิดจากคนร้ายแอบเสียบตัวเองเข้ามาคั่นการสนทนา ดังนั้นเราก็แค่ ใส่เกราะป้องกันช่องทางการสนทนา เพียงแค่นี้คนร้ายก็จะแอบแทรกระหว่างกลางไม่ได้แล้วนั่นเอง

วิธีการใส่เกราะป้องกันมีหลายวิธี แต่วิธีที่นิยมและใช้กันแพร่หลายที่สุดคือการทำ HTTPS ไงล่ะ แต่ว่า หลายคนเข้าใจผิดคิดว่าแค่ใส่ HTTPS เข้าไปอย่างเดียวมันจะปลอดภัย ซึ่งจริงๆมันไม่ใช่แบบนั้น เพราะอย่างที่บอกของทุกอย่างย่อมมีรูรั่วอยู่เสมอ ซึ่ง HTTPS ก็มีเช่นกัน

ดังนั้นในบทความนี้เราจะมาเรียนรู้หลักในการทำงานของ HTTPS ตั้งแต่ต้นจนจบประบวนการ แล้วมาดูกันว่า เขาจะโจมตี HTTPS นี้ได้ยังไง? รวมทั้งข้อเสียของการใช้ HTTPS มีอะไรบ้าง? กันดีก่า

🔥 Http vs Https

เวลาที่เราเข้าเว็บอะไรก็ตามเราจะเห็นตัวเว็บขึ้นต้นด้วย http:// หรือไม่ก็ https://อยู่เสมอชิมิ นั่นคือหนึ่งในช่องทางที่ให้คอมมันคุยกันได้ ซึ่งสิ่งสำคัญที่เราต้องรู้คือ

HTTP

สมมุติว่าเราส่งข้อความจีบสาวด้วย HTTP ธรรมดาละก็ ฟามลับก็อาจจะไม่ใช่ฟามลับอีกต่อปาย

ซ้ำร้ายกว่านั้นด้วย HTTP ธรรมดา เราจะไม่รู้เลยว่าอีกฝั่งที่เราคุยด้วย ใช่คนๆนั้นจริงๆหรือเปล่า

HTTPS

แถมเจ้า HTTPS ยังช่วยตรวจให้ว่า ฝั่งที่คุยด้วยเป็นคนที่เราอยากจะคุยด้วยจริงๆอะป่าว ดังนั้นคนร้ายไม่มีโอกาสแทรกเข้ามาเบย

โว้วๆๆๆๆ เหมือนเจ้า HTTPS จะเป็นดุจบร๊ะเจ้าเลยนิ แล้วไหงว่ามันมีข้อเสียอ่ะ? งั้นเราลองซูมเข้าไปดูการทำงานลึกๆของมันต่อดีกั่ว

🔐 SSL/TLS

🤫 กุญแจลับ

🔑 Symmetric Key

Symmetric Key หรือ กุญแจสมมาตร เป็นกุญแจที่สามารถใช้ได้ทั้ง เข้ารหัส และ ถอดรหัส ภายในดอกเดียวกัน ซึ่งถ้าเราเข้ารหัสด้วยกุญแจที่เป็น Symmetric ดอกไหนไป เมื่อจะถอดรหัสก็ต้องใช้กุญแจดอกเดิมในการถอดรหัสเท่านั้น ตามรูปด้านล่าง

เกร็ดความรู้ ปรกติ Symmetric Key นั้นควรจะมีความยาวขั้นต่ำที่ 128 bits แต่ถ้าจะให้ดีควรเป็น 256 bits ซึ่งในปัจจุบันถ้ามันต่ำกว่า 80 bits ในวงการ security ถือว่าไม่ปลอดภัยแล้ว

🔑 Asymmetric Key

Asymmetric Key หรือ กุญแจไม่สมมาตร ปรกติเรานิยมเรียกว่า กุญแจคู่ เพราะตอนที่สร้างกุญแจนั้น เราจะได้ออกมา 2 ดอก ซึ่งถ้าเราใช้ดอกไหนเข้ารหัสไป เมื่อจะถอดรหัสจะต้องใช้อีกดอกในการถอดรหัสเท่านั้น ตามรูปด้านล่าง

เจ้ากุญแจทั้ง 2 ดอกนี้มีชื่อเรียกของมันคือ Public Key กับ Private Key ซึ่งปรกติการใช้งานเราจะ

  • เก็บ Private key ให้ไม่ให้ใครเห็นเด็ดขาด รักษายิ่งชีพ

  • แจกจ่าย Public Key ให้กับคนที่เราอยากให้เขาคุยกับเราได้ หรือ เอาไว้ตรวจสอบเราเอง

เกร็ดความรู้ ปรกติ Asymmetric Key นั้นควรจะมีความยาวขั้นต่ำที่ 1024 bits แต่ถ้าจะให้ดีควรเป็น 2048 bits

ข้อควรระวัง โดยปรกติเจ้าตัว Asymmetric Key นั้น ตัวกุญแจทั้ง 2 ดอกมันมีความเกี่ยวข้องกันโดยสมการคณิตศาสตร์ฝังอยู่ (แต่ไม่สามารถคำนวณเพื่อสร้างกุญแจดอกตรงข้ามได้) เนื่องจากมันมีความเกี่ยวข้องกันเลยทำให้มันมีขนาดที่ใหญ่กว่า Symmetric Key มาก ดังนั้นตัว Asymmetric Key จะใช้การคำนวณมากกว่า Symmetric Key ราวๆ 1000 เท่า (ช้าโฮ๊กๆในเชิงคอมพิวเตอร์ แต่กระพริบตาก็เสร็จละ) ดังนั้นเราไม่ควรจะตะบี้ตะบันใช้ Asymmetric Key อยู่ตลอดเวลาถ้าไม่จำเป็นนั่นเอง

ซึ่งเจ้าพวกกุญแจพวกนี้ถ้าเปิดดูมันก็จะเป็นตัวอักษรยึกๆยือๆอ่านไม่ออก ตามตัวอย่างด้านล่าง

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-20200923"
AAAAB3NzaC1yc2EAAAABJQAAAQEAth/DV1CxXjus3l64YMz3kMsvpOzXbh0acKNh
XxVap3WtUvpeYI3Gk+4h4iEsVurAwRpKt4xq5aeKDG9u+5A0PiB9TFz0GUcIASey
dzwidLMOKxeQvF81ebyZQL7FLVUtjrS8ZDwa3t8SkCFbtkiaMcw40n4Q+THCcIGy
rmr/dCKEZS49GtpJrgTMO44z4JY6mvtBUmNLvk6aDtMsJi0MjnUUkoaaXPMpBrrm
svt40q5gL9a/vuA9+oMbtpnXm/QScz2yKmupE9MqQGKNsaO8f5MIBhMlGkZx6iq/
/8wCRIyAJGcyw8HxbKd5MM1LW5BZ8yci93iYtKoqAQkLL75u4Q==
---- END SSH2 PUBLIC KEY ----
PuTTY-User-Key-File-2: ssh-rsa
Encryption: none
Comment: rsa-key-20200923
Public-Lines: 6
AAAAB3NzaC1yc2EAAAABJQAAAQEAth/DV1CxXjus3l64YMz3kMsvpOzXbh0acKNh
XxVap3WtUvpeYI3Gk+4h4iEsVurAwRpKt4xq5aeKDG9u+5A0PiB9TFz0GUcIASey
dzwidLMOKxeQvF81ebyZQL7FLVUtjrS8ZDwa3t8SkCFbtkiaMcw40n4Q+THCcIGy
rmr/dCKEZS49GtpJrgTMO44z4JY6mvtBUmNLvk6aDtMsJi0MjnUUkoaaXPMpBrrm
svt40q5gL9a/vuA9+oMbtpnXm/QScz2yKmupE9MqQGKNsaO8f5MIBhMlGkZx6iq/
/8wCRIyAJGcyw8HxbKd5MM1LW5BZ8yci93iYtKoqAQkLL75u4Q==
Private-Lines: 14
AAABAATsGglHXr1bjwztzaHAWbfOI+Hc4zpT0Eg7xFyECV54zVVFCXg7LuFnTQYc
kn7jwAU4D9tyf239m/J/jWC+tU3JhtiM5ACu5Ipo209Upvw8MNC7cp1OrmsS72Kd
X0ZqFfzwIMRwU8DVmLfJjNtpvvptTaTS+YoxxvwfLle9s+CLQ/3WCxHiEG+Ddq22
/YV+AxMkPkaUJH4GcLQEtrZaioy2uQcMXRUkOIvK7auwDmBKmDnr/Br4/DTajeUB
qqsdb7PIyqZV3Zv7CN3kkENogb/K359STczYxAXDrQe5r+5c6qkN7SL8YEp29DVF
s+UNyKFPmfawSl8SV7PbUkakc20AAACBAOX3TY9Abf2ferCzYOeDkTc7DUpNq9hX
eAgny4/Lf0Ji1w6ajjmpClYuUCsS5zDg2RCD4yFNygeHeSikz8pPLasY7pTVseIP
UMdZ0e5UNg1Ygwyzr0vdg+dZAD+29eCJ2vjibnVKm1XG96S5IomWo9je0c/er1C8
Irakm4MNqlcpAAAAgQDKvfEURL/r8In0bLqoEc6Rm7D20U4tL+hH4lkz/5fD1TVH
8y7spaympBZhz6I0Bw1PTNguixnCz3Nw+IxikYVCXknTSlC/eToa1IfFn1Lubr2p
S36aoW41u+J+Kv+0R0Oc0vV3aqyw4n6IxJfBqe6Bw9QScU6IOuDGXbqj7E9o+QAA
AIEAoZtsKFA4BS/q+aUzwhdexT2uH16X4rCcKiKKI2jPSf/sO6jPEUaaHtOfSzw/
Z27jQxhcdZ0mJMJe8d2BRJRF6myOJoMBtWtz8O4rr9WEtt50ueJ3Qr2R0GEkCaWL
Ydp2PdjTIhdUHdcVkxuXZZPr3u2clNo+NB9eOuG6LD8Vups=
Private-MAC: e43051b15fd8eec51122ddd059c7b98869d69a38

🤔 TLS ทำงานไง?

อธิบายขั้นตอนทั้งหมด 🤠 ขั้นตอนทั้งหมดอย่างน้อยควรจะอ่านถึงข้อ 3 ก็จะพอเข้าใจประเด็นคร่าวๆเพื่อไปหัวข้อถัดไปได้ละ แต่ถ้าสนุกจะอ่านจนจบเลยกะได๊ โดยเริ่มต้นที่ฝั่งอัศวิน (Client) ที่ต้องการคุยกับเจ้าหญิง (Server) มันจะต้องทำขั้นตอนตามนี้

  1. ฝ่ายที่ต้องการคุย (อัศวิน) จะเป็นฝ่ายเริ่มก่อนโดยส่ง TLS เวอร์ชั่นของตัวเอง และ รูปแบบการเข้ารหัสที่ตัวเขารองรับ (Cipher Suites) ไปให้อีกฝั่ง โดยขั้นตอนนี้เราเรียกว่า Client Hello

  2. ฝั่งเจ้าหญิงรู้ว่ามีคนอยากคุยด้วย ก็จะเลือกว่าตัวเองควรจะเข้ารหัสแบบไหนดี เพื่อจะได้สะดวกทั้งสองฝั่ง ซึ่งเมื่อเลือกได้ก็จะส่งใบรับรอง (Certificate) ว่าฉันเป็นเจ้าหญิงที่เธอต้องการคุยด้วยจริงๆนะกลับไป ซึ่งภายในนั้นจะมี 🔑 Public key อยู่ โดยขั้นตอนนี้เราเรียกว่า Server Hello

  3. เมื่ออัศวินได้รับข้อความตอบกลับมา ก็จะเอาใบรับรองมาตรวจ (Certificate) ไปดูว่าใช่เจ้าหญิงคนที่จะคุยจริงๆป่ะ ซึ่งถ้าตรวจแล้วถูกต้อง อัศวินก็จะสร้างกุญแจ 🔑 Premaster secret ขึ้นมา

  4. ตัวอัศวินก็จะนำ 🔑 Public Key ที่ได้จากขั้นตอนที่ 2 ไปเข้ารหัสตัว 🔒 Premaster secret ทำให้มันอ่านไม่ออก แล้วค่อยส่งไปให้อีกฝั่ง เราเรียกขั้นตอนนี้ว่า Key Exchange

  5. ฝั่งเจ้าหญิงเมื่อได้รับข้อมูลมา ก็จะเอา 🔑 Private Key ของตัวเองไปถอดรหัสตัว Premaster secret ออกมา แล้วนำข้อมูลทั้งหมดที่เคยคุยกันไปสร้างสิ่งที่เรียกว่า 🔑 Session Key

  6. ตอนนี้เจ้าหญิงมีกุญแจลับที่เอาไว้เข้ารหัสละ ดังนั้นฝั่งเจ้าหญิงก็จะลองส่งข้อความที่เข้ารหัสไปทดสอบฝั่งอัศวิน เพื่อทดสอบว่าเขาสามารถสร้างกุญแจลับแบบเดียวกันได้หรือเปล่า

  7. เมื่ออัศวินได้รับข้อความลับมา เขาก็ต้องสร้างกุญแจลับ (🔑Session Key) ด้วยวิธีการเดียวกับที่ฝั่งเจ้าหญิงทำ เพื่อจะได้อ่านข้อความของเจ้าหญิง แล้วตอบกลับไปได้ว่าฉันอ่านเธอรู้เรื่องนะ

  8. อัศวินทำการตอบข้อความเจ้าหญิงกลับไป โดยเข้ารหัสด้วยกุญแจที่พึ่งสร้าง ซึ่งถ้าเจ้าหญิงได้รับ และสามารถอ่านรู้เรื่อง ก็จะเป็นการยืนยันว่าทั้ง 2 ฝั่งสามารถคุยกันได้โดยที่ไม่มีคนแอบอ่านข้อความของทั่ง 2 ฝั่งได้ละนั่นเอง

จากกระบวนการทั้งหมดมันจะทำให้มันตรวจสอบได้ว่า ฝั่งที่คุยด้วยเป็นคนที่เราอยากคุยด้วยจริงๆหรือเปล่า (โดยการตรวจ Certificate) และ มีแค่คู่สนทนานี้เท่านั้นที่จะคุยกันรู้เรื่อง (เพราะคนอื่นไม่มีกุญแจเอาไว้ถอดรหัส) แต่ก็ยังมีคำถามต่อว่า เราจะเชื่อตัวใบรับรอง (Cerificate) ที่ส่งมาจากขั้นตอนที่ 3 ได้ยังไง? เพราะถ้ามันเป็นของปลอม เราก็จะถูกหลอกทำ TLS กับคนที่เราไม่ได้อยากคุยด้วยได้ง่ายๆเลยนั่นเอง ดังนั้นเราก็ต้องรู้จักกับสิ่งที่เรียกว่า CA ต่อนั่นเอง

เกร็ดความรู้ การสร้างกุญแจลับสามารถทำได้หลายแบบ และหนึ่งในนั้นคือการใช้ข้อมูลที่เรามีไปสร้างกุญแจลับอันใหม่ และเราเรียกมันว่าการทำ Key Derivation ซึ่งปรกติถ้าเราใช้ ข้อมูลเดียวกันไปสร้างกุญแจลับอันใหม่ เราก็จะได้กุญแจลับแบบเดียวกันออกมา ดังนั้นในรูปด้านบน ขั้นตอนที่ 5 กับ 7 เมื่อ Client กับ Server มีข้อมูลเหมือนกัน และทั้ง 2 ฝั่งก็รู้ว่าจะใช้ Key Derivation แบบไหน ดังนั้นทั้ง 2 ฝั่งก็จะสามารถสร้าง Session Key ออกมาได้เป็นตัวเดียวกันนั่นเอง

🗃️ Certificate Authority

เมื่อฝั่งอัศวินได้รับ Chain-of-trust มาก็จะ ตะกุยหา Root Certificate ว่ามีคนรับรองที่ถูกต้องหรือเปล่า ซึ่งหาก Root มีคนรับรองที่ถูกต้องก็หมายความว่า สามารถเชื่อใจได้ว่าอีกฝั่งคือคนที่เราอยากคุยด้วยจริงๆตามรูปด้านล่าง

ตัว Certificate แต่ละใบจะถูกเข้ารหัสจาก Certificate ก่อนหน้า และมีการอ้างถึงใบที่สร้างมัน ทำให้เราสามารถเช็คย้อนกลับไปหา Root ได้ ตามโครงสร้างด้านล่าง

ดังนั้นเมื่อคนร้ายแอบปลอมตัวมา โดยทั่วไปคนร้ายจะไม่มี Certificate ที่ถูกยอมรับ ดังนั้นเขาก็จะต้องสร้าง Ceritifcate ของเขาเอง ดังนั้นในกระบวนการตรวจสอบก็จะแจ้งเตือนว่ามันไม่เป็นที่ยอมรับนะ นี่เลยเป็นหนึ่งในเหตุผลที่ Self-Sign ที่เราทำเองเซ็นเองถึงโดนแจ้งเตือนไปด้วย ตามรูปด้านล่าง

Self-Sign คือการออกใบรับรองเองเซ็นเอง ไม่ได้มีใครที่ไหนมารับรู้และยอมรับให้นั้น ปรกติเราจะ ใช้แค่ภายในของเราเอง หรือ ใช้ทดสอบ Security Development เท่านั้น ไม่เหมาะสมที่จะเอาไปใช้ในวงที่เป็น Public เพราะใครก็ปลอมเป็นคุณได้

โดยปรกติเวลาที่เราเข้าเว็บอะไรก็ตาม เจ้าตัว Web Browser ก็จะมีการบอกอยู่แล้วว่าปลอดภัยหรือเปล่า โดยมีรูปสัญลักษณ์ 🔒 กุญแจอยู่ ซึ่งเราสามารถกดเข้าไปดูรายละเอียดได้ เช่น Encryption ที่ใช้ ตัว Certificate ต่างๆที่ส่งมาตามรูปด้านล่างนั่นเอง

😷 จุดอ่อน

📜 X.509 PKI

🤝 Pre-Handshake

กระบวนการทั้งหมดถ้าการจับมือเสร็จสิ้นไปแล้วนับแทบจะพูดได้ว่าโดนโจมตีไม่ได้เลยก็ได้ นอกจากตัว client/server โดนโจมตีภายในทำให้ secret หลุดไป ซึ่งคนร้ายก็รู้ดีว่าการโจมตีแบบนั้นไม่ใช่เรื่องง่าย ดังนั้นสิ่งที่เขาจะเลือกทำก็คือ หลอกฝั่ง Client ก่อนที่จะทำ Handshake เพราะมันง่ายกว่าวิธีแรกมาก

💣 Client-Side

เนื่อจากการโจมตีฝั่ง Server ไม่ใช่เรื่องง่ายเลย แต่การโจมตีฝั่ง Client นั้นกลับทำได้ง่ายเสียกว่า เพราะโดยปรกติฝั่ง Client จะไม่ค่อยระวังตัว ชอบทำอะไรเปิ่นๆ ติดตั้งโปรแกรมมั่วซั่ว เข้า Wifi สาธารณะ ดังนั้นการโจมตีฝั่ง client เพื่อไปเอา secret หรือดักจับข้อมูลต่างๆจะทำได้ง่ายกว่า และที่สำคัญโปรแกรมส่วนใหญ่ที่อยู่ในตัว client นั้นจะเก็บรักษาของที่เป็น security ได้ค่อนข้างยาก และคนส่วนใหญ่ที่ไม่ได้ระวังก็อาจจะเอา secret data ไปเก็บไว้ในของที่ไม่สมควร เช่น cookie (ต่อให้เป็น secure cookie ก็ยังมีประเด็น) ดังนั้นให้ระวังฝั่ง client ไว้ให้ดี

🎯 บทสรุป

จากทั้งหมดที่เขียนไว้ก็น่าจะพอเข้าใจการทำงานของ HTTPS มากขึ้นแล้วชิมิ? ดังนั้นเมื่อไหร่ก็ตามที่เราจะต้องส่งข้อมูลที่มีความลับ หรือที่เราเรียกกันว่า Sentitive Information ไปหาใครก็ตาม เราควรจะต้องทำผ่าน HTTPS เพื่อป้องกันคนแอบเข้ามาป่วนเรานั่นเอง แต่ไม่ใช่แค่เราใช้ HTTPS แล้วก็จะนอนตีพุงสบายใจแฮได้นะ เพราะการจัดการที่ฝั่ง Client ก็มีผลสูงมากเหมือนกัน ซึ่งอย่างที่บอกไปว่า เหล่าคนร้ายเลือกที่จะโจมตี Client ก่อนเสมอ เพราะมันง่ายงุยล่ะ

การโจมตีแบบนี้จริงๆมีตัวอย่างอีกหลายแบบมาก ซึ่งส่วนใหญ่คนร้ายจะแอบเข้ามาอยู่ตรงกลางระหว่างเรากับเซิฟเวอร์ ดังนั้นเราเลยนิยมเรียกการโจมตีพวกนี้ว่า หรือ MITM งุยล่า (จริงๆวิธีการโจมตีแต่ละแบบก็จะมีชื่อเรียกของมันอยู่นะ)

เจ้าตัว http (ย่อจาก ) เวลามันส่งข้อมูลออกไป ข้อมูลพวกนั้นจะเป็นข้อความธรรมดา (Plain Text) นั่นหมายความว่า ถ้ามีคนใช้โปรแกรมดักจับข้อมูล (Packet Sniffer) แล้วจับข้อมูลของเราได้ เขาก็จะอ่านทุกอย่างที่เราส่งออกไปได้นั่นเอง

เจ้าตัว https (ย่อจาก ) ซึ่งเวลามันส่งข้อมูลออกไป ข้อมูลพวกนั้นจะถูกเข้ารหัสลับที่ทำให้ไม่สามารถอ่านได้เอาไว้ ซึ่งจะมีแค่คนที่มีกุญแจลับเท่านั้นถึงจะอ่านมันออก และโดยปรกติกุญแจลับจะอยู่กับคู่สนทนาทั้ง 2 ฝั่งเท่านั้น

เจ้า HTTPS มันมีหน้าที่ป้องกันการคุยกันให้เรา โดยเบื้องหลังของมันคือสิ่งที่เรียกว่า โดยในตอนแรกมันใช้ชื่อว่า SSL ย่อจาก Secure Sockets Layer แล้วก็ถูกอัพเกรดมาเรื่อยๆ ปัจจุบันมันชื่อว่า TLS ย่อจาก Transport Layer Security นั่นเอง ซึ่งเราจะเจอคำว่า SSL/TLS ตลอดเวลาแม้ว่า SSL จะตกยุคไปแล้วก็ตาม เพราะในวงการ Security นั้นมันมีการเปลี่ยนแปลงบ่อยมาก มันต้องไล่อุดรูรั่วตลอดเวลา ดังนั้นไม่ต้องแปลกใจที่จะเห็นคนบางกลุ่มยังใช้ของที่มันไม่ปลอดภัยแล้ว หรือใช้ยังวิธีการแบบเก่าๆอยู่ และบ่อยครั้งที่จะเจอว่าวันนี้บอกว่าใช้ตัวนี้ แล้วผ่านไปซักพักก็จะบอกว่าอย่าใช้ตัวนั้นนะ ดังนั้นจำไว้เลยวงการนี้ไม่แน่นอนต้องตามอัพเดทตลอด โดย TLS ล่าสุดคือเวอร์ชั่น 1.3

แนะนำให้อ่าน หากใครสนใจอยากรู้หลักการทำงานแบบเจาะลึกแบบฝุดๆ ให้ไปอ่านที่ลิงค์นี้ได้เลย

เพื่อให้เข้าใจ TLS เราจำเป็นต้องเข้าใจเรื่อง 🔑 กุญแจลับ ที่ใช้ในการเข้ารหัสเพื่อทำให้ข้อมูลกลายเป็นความลับ เพราะมันอ่านไม่ออกนั่นเอง โดยให้จำง่ายๆว่ามันมี 2 แบบคือ กับ

เวทมนต์ที่ทำให้ HTTPS ถูกป้องกันไม่ให้มีคนมาแอบแซกแซงได้นั้นคือ ให้คู่สนทนาทั้ง 2 ฝั่งตรวจสอบซึ่งกันและกันก่อนที่จะคุยความลับกัน โดยเราเรียกมันว่า 🤝 การจับมือ หรือ 🤝 Handshake ซึ่งรายละเอียดของมันจริงๆค่อนข้างเยอะและซับซ้อนมาก ดังนั้นจะขออธิบายแบบรวบรัดหน่อยนึง (แต่ถ้าอยากดูแบบเต็มให้กดที่ลิงค์นี้ )

ตัวใบรับรอง (Certificate) แต่ละอันจะมี ฝั่ง 3rd party ทำหน้าที่ในการตรวจสอบความถูกอีกที เพื่อรองรับว่า Certificate นั้นถูกต้องหรือไม่ โดยเจ้าสิ่งนี้เราเรียกว่า Certificate Authority หรือ CA นั่นเอง ซึ่งโดยปรกติจะมีมาตรฐานที่ชื่อว่า เอาไว้ควบคุมว่า เช่น CA ไหนได้รับการยอมรับแล้ว หรือ CA ไหนโดนเพิกถอนการยอมรับ เพราะอาจจะหมดอายุหรือประพฤติไม่เหมาะสมก็จะไม่เชื่อใจ CA พวกนั้นอีกต่อไป

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

จากที่ร่ายมายาวเหยียดเราก็พอจะเห็นภาพคร่าวๆแล้วว่าการทำ HTTPS จะช่วยให้ป้องกันการโจมตีแบบ ได้ แต่ตัวมันเองนั้นก็มีจุดอ่อนเช่นกัน ดังนั้นมาไล่กันแบบคร่าวๆดีกั่ว

ตัวมาตรฐานในการดูแลเรื่อง CA หรือที่เราเรียกว่า นั้นมีช่องโหว่อยู่ที่ CA สามารถออก Certificate ให้ Domain ไหนก็ได้ ซึ่งโดยปรกติเขาก็จะตรวจความถูกต้องต่างๆนาๆก่อนที่จะออกใบรับรองแหละ แต่จะเกิดอะไรขึ้นถ้า CA ตั้งใจจะโกงเอง? CA ตรวจสอบผิดพลาดหรือถูกหลอก? หรือซ้ำร้ายไปกว่านั้นคือโดนโจมตีใน DNS ว่า domain นั้นยังไม่ถูกจอง หรือตัว domain พลาดในการตรวจสอบเสียเอง

หากมีเนื้อหาในจุดไหนผิดพลาด ตกหล่น หรืออ่านแล้วไม่ชอบ อยากหอมแก้มแมวน้ำ ก็ไปติดตามต่อได้ที่เพจ ได้เบย จะได้คุยกันต่อ และไม่พลาดอัพเดทใหม่กันฮ๊าฟ

👦
Man-in-the-middle Attack
HyperText Transfer Protocol
HyperText Transfer Protocol Secure
SSL/TLS
The Transport Layer Security (TLS) Protocol Version 1.3
Symmetric Key
Asymmetric Key
TLS Protocal
X.509
Chain-of-trust
Trust Anchor
Man-in-the-middle Attack
X.509 PKI
Facebook Mr.Saladpuk
👦 Security พื้นฐาน
ใช้กุญแจดอกไหนเข้ารหัส ก็ต้องใช้ดอกนั้นถอดรหัส
ใช้กุญแจดอกไหนเข้ารหัส ก็ต้องใช้ดอกตรงข้ามมาถอดรหัส
Handshake
ถ้าตรวจหมดแล้วไม่เจอ Root เลย ก็แสดงว่าเชื่อใจไม่ได้
https://en.wikipedia.org/wiki/Chain_of_trust