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
  • 🦉 นิทานเรื่องที่สอง
  • 🔥 ห้ามเก็บความลับไว้โดยไม่เข้ารหัสนะเฟร้ย !!
  • 🔥 การเข้ารหัสห้ามทำย้อนกลับได้นะเฟร้ย !!
  • 🔥 ห้ามให้คนอื่นเดาได้ว่ารหัสผ่านแต่ละคนสั้นยาวต่างกัน
  • 🔥 รหัสผ่านแม้ว่ามันจะเป็นอันเดียวกัน ก็ต้องห้ามให้มันเก็บเป็นค่าเดียวกัน
  • 🔥 การเข้ารหัสควรทำให้มันเสียเวลาในการถอดรหัส
  • 🔥 กระบวนการทั้งหมดไม่ควรทำบท disk
  • 🔥 อย่าเขียนการเข้า-ถอดรหัสเอง !!
  • 🤔 ต้องทำขนาดนี้ด้วยเหรอ ?
  • 🔥 Rainbow Table
  • 🔥 Dictionary Attack
  • 🔥 Bruteforce Attack
  • 🔥 Computing Power
  • 🎯 บทสรุป

Was this helpful?

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

การเก็บรหัสผ่านที่ถูกต้อง

🤔 ถ้าเราต้องเก็บความลับของลูกค้าไว้ เราจะต้องเก็บยังไงถึงจะเรียกว่าปลอดภัย?

PreviousSecurity พื้นฐานNextSecurity in actions

Last updated 5 years ago

Was this helpful?

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

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

🦉 นิทานเรื่องที่สอง

เว็บไซต์ เฟสปาล์ม ได้เปิดตัวบริการ Social Media ที่สั่นสะท้านวงการ ทำให้มีคนนับล้านๆคนเข้าไปใช้บริการอย่างล้นหลา จนมียอดผู้ใช้ทะลุหลัก 1,000 ล้านคนภายในเวลาไม่นาน จนกระทั่งวันหนึ่งก็มีข่าวช๊อกโลก เพราะมีคนจับได้ว่าเฟสปาล์มได้ทำการขายข้อมูลผู้ใช้ให้กับบริษัทต่างๆ เลยทำให้ Hacker ทั่วโลกโกรธเกรี้ยวบริษัทเฟสปาล์มเป็นอันมาก และหนึ่งในบรรดา Hacker ก็เจาะเข้าระบบฐานข้อมูล ดึงข้อมูลผู้ใช้ออกมาได้ส่วนนึง ทำให้มีผู้ใช้หลายล้านรายที่ตกเป็นเหยื่อ เพราะถูกล่วงรู้ รหัสผ่าน และแม้กระทั่งข้อมูลบัตรเครดิตนั่นเอง

ดังนั้นบริษัทเฟสปาล์มเลยต้องมาวางแผนรับมือไม่ให้เกิดปัญหาที่ว่ามานี้อีก โดยสิ่งที่แรกเอามาดูก็คือ ข้อมูลผู้ใช้ที่อยู่ในฐานข้อมูล มันเป็นประมาณนี้

Id

Username

Password

1

saladpuk

1234

2

thaksin

homesick

3

prayut

1234

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

🔥 ห้ามเก็บความลับไว้โดยไม่เข้ารหัสนะเฟร้ย !!

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

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

แม้ วอดก้า จะหงุดหงิดได้แต่คิดในใจว่า "ทำไมเอ็งไม่ไปแก้ให้มันเจาะไม่ได้แทนฟระ?" แต่เขาก็ไม่ได้พูดออกมา ได้แต่ก้มหน้าเพิ่มให้ระบบต้องทำการเข้ารหัสตัว password ก่อนที่จะเอาไปเก็บลงฐานข้อมูล โดยใช้ DES ในการเข้ารหัส ซึ่งทำให้ฐานข้อมูลเป็นแบบนี้ (ผลลัพท์เป็นแบบสมมุตินะ)

Id

Username

Password

1

saladpuk

A1B2C3D4

2

thaksin

CF67D00569ACC1

3

prayut

A1B2C3D4

ยิน มองข้อมูลในฐานข้อมูลตาถลน พร้อมกับตะโกนบอก วอดก้า ไปว่า

🔥 การเข้ารหัสห้ามทำย้อนกลับได้นะเฟร้ย !!

วอดก้า งง เป็นไก่ตาแตกเพราะไม่รู้ว่าจะต้องเข้ารหัสยังไงดี เลยทำให้ เบลม็อท เข้ามาช่วยอธิบายให้ฟังเป็นข้อๆว่า Data Encryption Standard (DES) ที่ วอดก้า ใช้ในการเข้ารหัส มันเป็นรุ่นสมัยก่อนที่เขาไม่ใช้กันแล้ว (56-bits key) เพราะมันตั้งแต่ 1999 มันใช้เวลาแค่ 22 ชั่วโมงนิดๆก็สามารถถอดรหัสกลับมาได้แล้วยังไงล่ะ ดังนั้นจงเลือก algorithm ที่เหมาะสมกับมันด้วย ไม่ใช่ตะบี้ตะบันเจอใน Stackoverflow ตัวไหนก็จับมายัดใส่เลย ดังนั้นจงไปศึกษาเพิ่มซะ

🔥 ห้ามให้คนอื่นเดาได้ว่ารหัสผ่านแต่ละคนสั้นยาวต่างกัน

🔥 รหัสผ่านแม้ว่ามันจะเป็นอันเดียวกัน ก็ต้องห้ามให้มันเก็บเป็นค่าเดียวกัน

เบลม็อท ชี้ให้เห็นรหัสผ่านของเจ้า saladpuk กับ prayut ว่าผลลัพท์มันได้เป็นค่าเดียวกันเลย เพราะถ้าเก็บเป็นแบบนี้ เมื่อมีคนถอดรหัสของใครซักคนได้ เขาก็จะรู้รหัสผ่านของคนอื่นๆที่ใช้รหัสแบบเดียวกันทันทีเลยอะดิ ดังนั้นถ้าต้องการให้ ความลับที่เป็นค่าเดียวกัน แต่ได้ผลลัพท์ต่างกัน เราก็สามารถใส่ของมั่วๆเข้าไปในความลับนั้นก็ได้ โดยเราเรียกมันว่า Salt หรือ Nonce (number used only once) นั่นเอง

Salt

เป็นการสุ่มอะไรมั่วๆซักอย่างเข้าไปต่อกับสิ่งที่เราต้องการให้เป็นความลับ เช่น รหัสผ่านของ saladpuk คือ 1234 เราก็อาจจะสร้าง salt ออกมาเป็น su!sC* แล้วเอามันไปต่อท้ายหรือไว้ก่อนหน้าก็ได้เลือกเอาซักอย่าง เราก็จะได้ผลลัพท์ออกมาเป็น 1234su!sC* (ในตัวอย่างคือเอาไปต่อท้าย) ซึ่งผู้ใช้แต่ละคนก็จะต้องมี salt เป็นคนละตัวกันด้วยนะ ดังนั้น รหัสผ้านของ prayut คือ 1234 เราก็จะสร้าง salt ออกมาอีกตัวสมมุติว่าเป็น A#$563d เราก็เอามันมาต่อท้ายก็จะออกมาเป็น 1234A#$563d ดังนั้นพอเอาค่าทั้ง 2 ตัวนี้มีผ่านการ HASH เราก็จะได้ผลลัพท์ที่ไม่เหมือนกันยังไงล่ะ ตามรูปเลย

Id

Username

Password

Salt

1

saladpuk

fd4438f5b856bb685004b84221ba794b

su!sC*

2

thaksin

f679b30fde31dff10304dc357300c52b

$%Acdes

3

prayut

3d54cf99f817a21cd9fd2b7218e58fec

A#$563d

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

🔥 การเข้ารหัสควรทำให้มันเสียเวลาในการถอดรหัส

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

Pepper

หลักการเหมือนกับ salt เลยคือสุ่มของมั่วๆขึ้นมาซักตัว แต่จะสุ่มแค่ 1 ตัวอักษร อาจจะเป็นตัวเล็กหรือตัวใหญ่ก็ได้ เพื่อเอาไปต่อกับความลับของเราให้มันยาวขึ้น เวลาที่เอาไป HASH มันจะได้ผลลัพท์ออกมาไม่เหมือนเพื่อนนั่นแต่ แต่จะต่างกันคือ มันจะไม่เก็บค่า papper ไว้ที่ไหนอีกเลย ดังนั้นเวลาที่เราจะตรวจสอบว่าผู้ใช้ ใส่รหัสผ่านถูกหรือเปล่า ระบบจะต้องเสียเวลาในการไปสุ่มตั้ง a-z และ A-Z ซึ่งถ้ามีผลลัพท์ไหนตรงกับรหัสผ่านที่เก็บไว้ ก็แสดงว่ารหัสผ่านที่ส่งเข้ามาถูกต้องนั่นเอง

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

🔥 กระบวนการทั้งหมดไม่ควรทำบท disk

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

🔥 อย่าเขียนการเข้า-ถอดรหัสเอง !!

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

🤔 ต้องทำขนาดนี้ด้วยเหรอ ?

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

🔥 Rainbow Table

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

🔥 Dictionary Attack

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

🔥 Bruteforce Attack

เป็นการพยายามหาคำตอบโดยแทยที่ทุกความเป็นไปได้ลงไป เช่น แทนค่าตั้งแต่ aaaaaaaa~ZZZZZZZZZ ไรงี้ เพื่อให้ฟลุ๊คแล้วเจอผลลัพท์ที่ตรงกับ HASH ที่เก็บไว้นั่นเอง ซึ่งปัจจุบันตัว PIN ก็พึ่งเป็นข่าวว่าโดนโจมตีโดยใช้เจ้าตัวนี้อยู่ เพราะมันเป็นแค่ตัวเลขไม่เกิน 8 หลักไรงี้ไง

🔥 Computing Power

เมื่อหลายปีก่อน เครื่องถอดรหัสสามารถถอด HASH ได้ราวๆ 1,000,000,000 ล้านตัวต่อ 1 วินาที ดังนั้นไม่น่าแปลกใจเลยใช่ไหมว่าทำไมเราต้องทำให้รหัสผ่านมันต้องใช้เวลาให้ถอดรหัสนานที่สุดเท่าที่เป็นไปได้

🎯 บทสรุป

การเก็บรหัสผ่านไว้ในฐานข้อมูลจริงๆมีอีกหลายเรื่องที่อยากจะเล่าให้ฟัง ดังนั้นในบทความหน้าเดี๋ยวเรามาลองดูกันว่า แค่เรื่องการ Login เข้าสู่ระบบธรรมดาๆที่พบได้ทั่วไป เชื่อไหมว่าเบื้องหลังจริงๆมันไม่ได้ง่ายแบบนั้นนะถ้าเราต้องเอาเรื่อง security เข้ามาใช้ด้วย

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

  • ห้ามเก็บความลับเป็น plain text

  • แม้กระทั่งคนภายในของเราเองก็ต้องห้ามรู้รหัสลับต่างๆที่เก็บไว้ในฐานข้อมูล

  • การถอดรหัสควรจะต้องใช้เวลาในการถอดรหัสนานที่สุดเท่าที่จะทำได้

  • รหัสผ่านแม้จะเป็นรหัสเดียวกันก็ต้องเก็บลงในฐานข้อมูลเป็นคนละตัวกัน

  • ห้ามให้ใครเดาได้ว่ารหัสผ่านแต่ละคนยาวสั้นต่างกัน

  • การเข้ารหัสถอดรหัสต่างๆควรทำใน Memory ห้ามมาทำไว้บน disk

  • ให้ใช้ Security Library ที่สากลเขาใช้ ดีกว่าเขียนเองเสมอ

เบลม็อท ชี้ไปที่รหัสผ่านของเจ้า saladpuk กับ thaksin แล้วพูดว่า ดูปุ๊ปก็พอจะเดาได้ว่ารหัสผ่านของ saladpuk น่าจะสั้นกว่าของ thaksin ดังนั้นถ้าเขารู้รหัสผ่านของ thaksin เขาก็จะรู้แนวทางในการใส่รหัสผ่านของคนอื่น ที่สั้นหรือยาวกว่าของ thaksin นั่นเอง พูดจบ เบลม็อท ก็เปิดบทความของ สลักผัก ขึ้นมาให้อ่านเรื่องการใช้ HASH เพื่อแปลงข้อความให้มันมีความยาวเท่ากันเสมอ (ถ้าลืมไปแล้วหรืออยากทบทวนก็กดไปอ่านจากตรงนี้ซะ )

👦
👦 Security พื้นฐาน
การใช้ HASH function