Lecture 3 — Authentication
ระบบรู้ได้ยังไงว่าคุณคือคุณจริง คาบนี้ไล่ตั้งแต่วิธีพิสูจน์ตัวตนสามกลุ่ม ไปจนถึงว่ารหัสผ่านถูกเก็บยังไงและถูกเจาะยังไง
เลกเชอร์ 3 · อ่าน 35 นาที · เรียบเรียงจากสไลด์ Chapter 3 ของ Krerk Piromsopa, Ph.D.
Authentication คือการพิสูจน์ว่าคุณเป็นคนที่คุณอ้างว่าเป็นจริง ทำได้สามทางคือ สิ่งที่คุณรู้ สิ่งที่คุณถือ และ คนที่คุณเชื่อ ไม่มีทางไหนสมบูรณ์แบบ ระบบจริงจึงเอาหลายทางมาต่อกัน
เนื้อหามาจากสไลด์ Chapter 3 หน้า 20–41 ของไฟล์ Lecture-2,3.pdf คำนิยาม รายการต่าง ๆ ค่าแฮชตัวอย่าง และลิงก์ทั้งหมดมาจากสไลด์จริง ส่วนคำอธิบาย รูป ตาราง และกล่องที่ติดป้าย "เสริม" เขียนขึ้นใหม่
คาบนี้ต่อจาก Lecture 2 — Security Components ที่บอกว่า Authentication เป็นด่านแรกในสามด่านของ AAA คาบนี้เจาะเข้าไปในด่านนั้นด่านเดียว
คาบนี้จะพาไปไหน
หัวข้อของคาบนี้มีเจ็ดก้อน หน้านี้จัดเป็นหกส่วน
| คำถาม | คำตอบอยู่ที่ |
|---|---|
| Authentication แปลว่าอะไร และใช้กับอะไรได้บ้าง | ส่วนที่ 1 |
| พิสูจน์ตัวตนได้ด้วยวิธีไหนบ้าง | ส่วนที่ 2 |
| เอาหลายวิธีมาต่อกันได้ยังไง | ส่วนที่ 3 |
| รหัสผ่านหนึ่งอันแข็งแรงแค่ไหน และถูกเก็บยังไง | ส่วนที่ 4 |
| คนที่จะเจาะรหัสผ่านใช้วิธีไหน | ส่วนที่ 5 |
| แล้วป้องกันยังไง | ส่วนที่ 6 |
ส่วนที่ 1 — Authentication คืออะไร
It's easy to know men's faces, not their hearts.
— Chinese Proverb (สุภาษิตจีน: รู้หน้าไม่รู้ใจ)
นิยามสองมุม
นิยามมีสองมุม อ้างอิงจาก dictionary.com
- ในระบบคอมพิวเตอร์ — Authentication (การพิสูจน์ตัวจริง) คือกระบวนการยืนยันตัวตนของผู้ใช้
- ในระบบสื่อสาร — คือกระบวนการยืนยันว่าข้อความนั้นมาจากต้นทางที่มันอ้างไว้จริง
แล้วขยายความไว้อีกสองบรรทัด
- การตรวจสอบว่าสิ่งนั้น น่าเชื่อถือ เป็นของแท้ หรือเชื่อถือได้ (trustworthy, genuine, or creditable)
- ทำได้โดยการ ตรวจของที่ถืออยู่ (examination of a token) หรือ ตรวจคุณสมบัติของตัวมันเอง (investigation of some property of the subject itself)
สองบรรทัดหลังคือแก่นของทั้งคาบ
การพิสูจน์ตัวตนทำได้แค่สองแบบเท่านั้น คือ ดูของที่คุณถือมา เช่น บัตร กุญแจ รหัสผ่านที่คุณจำมา หรือ ดูตัวคุณเอง เช่น ลายนิ้วมือ ใบหน้า เสียง
วิธีทั้งหมดในส่วนที่ 2 แตกออกมาจากสองแบบนี้
เอาไปพิสูจน์อะไรได้บ้าง
คำว่า authentication ไม่ได้ใช้กับคนเท่านั้น
| พิสูจน์อะไร | ตัวอย่าง |
|---|---|
| ความเป็นของแท้ของเอกสาร | ใบแสดงผลการเรียน ธนบัตร เช็ค |
| ตัวตนของคน | นิสิต สมาชิกของกลุ่ม |
| ต้นทางของข้อมูล | network packet, อีเมล |
| ความเป็นเจ้าของ | บ้าน รถ |
แล้วคำถามที่ทิ้งไว้โดยไม่มีคำตอบคือ แล้วซอฟต์แวร์หรือระบบคอมพิวเตอร์ล่ะ พิสูจน์ยังไง
เวลาโหลดโปรแกรมมาติดตั้ง เครื่องเราต้องรู้ให้ได้ว่าไฟล์นี้มาจากคนที่เขาอ้างจริง ไม่ใช่ไฟล์ที่ถูกสลับระหว่างทาง วิธีที่ใช้กันคือผู้พัฒนาเซ็นไฟล์ด้วยกุญแจของตัวเอง แล้วเครื่องเราตรวจลายเซ็นนั้น
นี่คือ authentication แบบ "ตรวจของที่ถืออยู่" ตามนิยามข้างบน ต่างกันแค่ตรงที่ผู้ถูกพิสูจน์เป็นไฟล์ ไม่ใช่คน
ส่วนที่ 2 — วิธีพิสูจน์ตัวตนสามกลุ่ม
วิธีทั้งหมดแบ่งเป็นสามกลุ่ม ภายใต้หลักเดียวกันว่า
Every authentication method has its own strength and weakness, and there is no such thing as a perfect authentication method.
ทุกวิธีมีทั้งจุดแข็งและจุดอ่อนของตัวเอง และไม่มีสิ่งที่เรียกว่าวิธีพิสูจน์ตัวตนที่สมบูรณ์แบบ
กลุ่มที่ 1 — What do you know? สิ่งที่คุณรู้
A secret between two is God's secret, a secret between three is everybody's.
— Spanish Proverb (ความลับที่รู้กันสองคนคือความลับของพระเจ้า ความลับที่รู้กันสามคนคือความลับของทุกคน)
สุภาษิตนี้บอกจุดอ่อนของทั้งกลุ่มไว้แล้ว ความลับที่ต้องบอกให้อีกฝ่ายรู้ ก็ไม่ใช่ความลับอีกต่อไป
กลุ่มนี้มีสี่วิธี
- Prearranged questions — คำถามที่นัดกันไว้ล่วงหน้า
- Password หรือ Passphrase — รหัสผ่านหรือวลีรหัสผ่าน
- One-time pad — รหัสที่ใช้ครั้งเดียวแล้วทิ้ง
- Challenge and Response — ฝ่ายหนึ่งตั้งโจทย์ อีกฝ่ายตอบ ตัวอย่างโจทย์คือ
How much is 1+1 ?
ที่มาของวิธีนี้คือ ในอดีตทหารอเมริกันต้องนัดคำถามไว้กับกองทัพล่วงหน้า เพื่อใช้ยืนยันตัวเองในกรณีฉุกเฉิน
Challenge and Response ทำงานยังไง
ขั้นตอนเขียนไว้สองบรรทัด
Alice > Bob : N
Bob > Alice : {N,B}kอ่านทีละบรรทัด
- บรรทัดแรก Alice ส่งเลข
Nไปให้ Bob เลขนี้เป็นเลขสุ่มที่ใช้ครั้งเดียว - บรรทัดที่สอง Bob ส่ง
{N,B}kกลับมา วงเล็บปีกกาแปลว่าเข้ารหัสไว้ ตัวkห้อยท้ายคือกุญแจที่ใช้เข้ารหัส ซึ่งเป็นกุญแจที่ Alice กับ Bob รู้กันสองคน ส่วนBคือข้อมูลฝั่ง Bob
Alice ถอดรหัสแล้วต้องได้ N ตัวเดิมที่ตัวเองส่งไป ถ้าได้ก็แปลว่าอีกฝั่งมีกุญแจ k จริง
จุดประสงค์คือ prevent replay attacks และตัวอย่างใกล้ตัวคือ รีโมทกุญแจรถสมัยนี้ใช้วิธีนี้แล้ว
Replay attack (การอัดข้อความเก่าไปส่งซ้ำ) คือการที่คนกลางดักฟังข้อความตอนที่คนอื่นคุยกัน แล้วเอาข้อความนั้นไปส่งซ้ำเพื่อแอบอ้างเป็นคนนั้น
ถ้ารีโมทรถส่งรหัสเดิมทุกครั้งที่กดปุ่ม คนที่นั่งดักฟังอยู่ในลานจอดรถแค่ครั้งเดียว ก็อัดรหัสนั้นไว้แล้วเปิดรถเราได้ตลอดไป
Challenge and response แก้ตรงนี้ด้วยการทำให้ N เปลี่ยนทุกครั้ง คำตอบที่ถูกอัดไว้เมื่อวานจึงตอบโจทย์ของวันนี้ไม่ได้
กลุ่มที่ 2 — What do you have? สิ่งที่คุณถือ
กลุ่มนี้แบ่งไว้สามชั้น
- Tokens — ของที่ถือติดตัว เช่น บัตรประจำตัว (ID) และตราประทับ (Seal)
- Smart Tokens — ของที่ถือติดตัวและคำนวณอะไรได้เอง
- Biometrics — คุณสมบัติของร่างกายเรา
รายการ biometrics มีเก้าอย่าง
| ใช้ส่วนไหนของร่างกาย | รายการ |
|---|---|
| มือ | Fingerprints, Hand/Palm geometry |
| ใบหน้าและดวงตา | Face Recognition, Retinal |
| อื่น ๆ ในร่างกาย | Dental biometrics, Vein |
| พฤติกรรม | Handwriting, Voice, Pattern (จังหวะการเดินหรือการพิมพ์) |
Biometrics ถูกจัดอยู่ในกลุ่ม "สิ่งที่คุณถือ" ไม่ใช่กลุ่ม "สิ่งที่คุณรู้" เพราะมันคือคุณสมบัติที่ติดตัวมา ไม่ใช่ความลับที่จำไว้ในหัว
ข้อแตกต่างที่สำคัญคือ รหัสผ่านหลุดแล้วเปลี่ยนได้ ลายนิ้วมือหลุดแล้วเปลี่ยนไม่ได้ และตามนิยามในส่วนที่ 1 biometrics คือการ "ตรวจคุณสมบัติของตัวมันเอง" ซึ่งเป็นคนละแบบกับการตรวจของที่ถือมา
กลุ่มที่ 3 — Who do you trust? คนที่คุณเชื่อ
กลุ่มนี้แบ่งไว้สองแบบ
Third party authentication — ให้คนอื่นเป็นคนพิสูจน์แทนเรา แล้วเราเชื่อผลของเขา
- Facebook Login
- Google Login
- ChulaSSO
Proximity / Trusted Zone — เชื่อเพราะอยู่ในเขตที่ไว้ใจ ตัวอย่างคือ dress like a student on the campus คือแต่งตัวเหมือนนิสิตแล้วเดินในมหาวิทยาลัย คนก็เชื่อว่าเป็นนิสิต
Proximity เป็นวิธีที่อ่อนที่สุดในสามกลุ่ม เพราะมันไม่ได้พิสูจน์อะไรเลย แค่อาศัยว่า "คนที่เข้ามาถึงตรงนี้ได้ น่าจะมีสิทธิ์"
ตัวอย่างข้างบนตรงไปตรงมามาก ใครก็แต่งตัวเหมือนนิสิตได้ ในระบบคอมพิวเตอร์ก็เหมือนกัน การเชื่อว่า "เครื่องนี้อยู่ใน network ของออฟฟิศ เพราะฉะนั้นเชื่อได้" คือกับดักแบบเดียวกัน
ลองตอบดู: การ login เข้าเว็บหนึ่งด้วยปุ่ม Sign in with Google อยู่ในกลุ่มไหน
กลุ่มที่ 3 คือ Who do you trust?
เว็บนั้นไม่ได้พิสูจน์ตัวเราเลย มันเพียงถาม Google ว่า "คนนี้คือใคร" แล้วเชื่อคำตอบของ Google
สังเกตว่าตัว Google เองอาจใช้กลุ่มที่ 1 (รหัสผ่าน) และกลุ่มที่ 2 (รหัสจากแอป) ในการพิสูจน์ แต่จากมุมของเว็บปลายทาง มันคือการเชื่อบุคคลที่สาม จุดอ่อนของมันจึงเป็นคนละเรื่อง คือถ้าบัญชี Google ของเราถูกยึด ทุกเว็บที่ผูกไว้ก็ถูกยึดตามไปด้วย
ส่วนที่ 3 — เอาหลายวิธีมาต่อกันเป็น Protocol
Authentication Protocol (ลำดับขั้นตอนการพิสูจน์ตัวตน) นิยามสั้น ๆ ว่า การเอาหลายวิธีมารวมกัน เช่น ใช้รหัสผ่านคู่กับ smart token
ตัวอย่างมีสี่ขั้น
ผู้ใช้ล็อกอินด้วย SSH เข้าไปที่เครื่องเกตเวย์ของระบบ
นี่คือกลุ่มที่ 1 — สิ่งที่คุณรู้ ถ้าจบแค่นี้ ใครที่ได้รหัสผ่านไปก็เข้าได้ทันที
เหตุผลที่ต้องต่อกันหลายวิธีมาจากประโยคในหน้า 24 ที่ว่าไม่มีวิธีไหนสมบูรณ์แบบ
จุดอ่อนของแต่ละกลุ่มไม่เหมือนกัน รหัสผ่านถูกเดาหรือถูกหลอกเอาไปได้ การ์ดถูกขโมยหรือทำหายได้ แต่การที่คนคนเดียวจะทั้งรู้รหัสผ่านของเรา และ ขโมยการ์ดจากกระเป๋าเราไปด้วยพร้อมกัน ยากกว่าอย่างใดอย่างหนึ่งมาก
Zero-Knowledge Password Proof
Zero-Knowledge Password Proof (การพิสูจน์ว่ารู้รหัส โดยไม่ต้องบอกรหัส) หรือ ZKPP คือ authentication protocol ที่ พิสูจน์ว่ารู้รหัสผ่าน โดยไม่ต้องพูดรหัสผ่านออกมาดัง ๆ
วิธีปกติคือส่งรหัสผ่านไปให้อีกฝั่งตรวจ ปัญหาคือระหว่างทางอาจมีคนดักฟัง และปลายทางเองก็ได้เห็นรหัสผ่านของเราไปเต็ม ๆ ต่อให้เราไม่ได้อยากให้เขาเห็น
ZKPP ตัดปัญหานี้ทิ้ง ด้วยการเปลี่ยนจาก "ส่งความลับไปให้ตรวจ" เป็น "ทำอะไรบางอย่างที่ทำได้เฉพาะคนที่รู้ความลับ"
คำอธิบายมาเป็นสองภาพ
ภาพแรก — Where is Waldo? ทั้งสองฝ่ายมีรูปเดียวกัน คนที่จะพิสูจน์บอกพิกัดของ Waldo ในรูป อีกฝ่ายก็รู้ว่าคนนี้หา Waldo เจอจริง
ภาพที่สอง — เด็กกับอุโมงค์ อธิบายละเอียดกว่า
โจทย์คือ พิสูจน์ว่าเด็กคนนั้นมีกุญแจของประตูที่อยู่ปลายอุโมงค์ โดยเราไม่ต้องเห็นกุญแจ
ขั้นตอนมีดังนี้
- ให้เด็กเดินเข้าไปในอุโมงค์ โดยเราไม่เห็นว่าเธอเลือกทางไหน
- เราขอให้เธอออกมาทางที่เราสุ่มเลือก
- ทำซ้ำหลายรอบ
- ถ้าเธอออกมาถูกทางทุกครั้ง แปลว่าเธอมีกุญแจจริง
ถ้าเธอไม่มีกุญแจ เธอเดาได้แค่ว่าเราจะเรียกทางไหน แล้วเดินเข้าไปทางนั้น
รอบเดียวเธอมีโอกาสรอด 50% สองรอบเหลือ 25% สิบรอบเหลือประมาณหนึ่งในพัน ยิ่งทำซ้ำมาก โอกาสที่คนไม่มีกุญแจจะฟลุกผ่านทุกรอบก็ยิ่งเข้าใกล้ศูนย์ ในขณะที่คนมีกุญแจผ่าน 100% ทุกรอบเสมอ
จุดสำคัญคือ ตลอดทั้งกระบวนการ เราไม่เคยเห็นกุญแจเลย เรารู้แค่ว่าเธอมี
ข้อสรุปของหัวข้อนี้คือ Modern authentications are based on ZKPP คือระบบพิสูจน์ตัวตนสมัยใหม่ตั้งอยู่บนแนวคิดนี้
ส่วนที่ 4 — รหัสผ่านแข็งแรงแค่ไหน
ส่วนนี้เปิดด้วยประโยคว่า
We still rely on Username/Password, but how strong is it?
เรายังพึ่งชื่อผู้ใช้กับรหัสผ่านอยู่ แต่มันแข็งแรงแค่ไหนกัน
รหัสผ่านแบบไหนดี แบบไหนไม่ดี
สองคอลัมน์นี้มีเครื่องหมายคำถามกำกับทั้งสองฝั่ง
QwertyQ1w2e3r4t5yPassword1Password2
ทั้งสี่อันเดินตามรูปแบบที่คนใช้กันเยอะ คือแถวแป้นพิมพ์ และคำว่า password ต่อด้วยเลข
act10n0wn3r4U&m3p3nc1l
ทั้งสี่อันแทนตัวอักษรด้วยเลขหรือสัญลักษณ์ที่หน้าตาคล้ายกัน เช่น o เป็น 0 และ e เป็น 3
สังเกตว่าทั้งสองหัวข้อมีเครื่องหมายคำถามติดมาด้วย คือ Substitution (Good?) และ Guessable pattern (Bad?) จึงไม่ได้ฟันธงว่าฝั่งซ้ายดีจริง
เหตุผลอยู่ในส่วนที่ 5 คือ dictionary attack สมัยนี้ไม่ได้ลองแค่คำในพจนานุกรม แต่ลองคำที่ผ่านการแทนตัวอักษรแบบนี้ด้วย p3nc1l จึงไม่ได้แข็งแรงกว่า pencil มากอย่างที่คนคิด สิ่งที่ช่วยจริงคือความยาว ซึ่งเป็นเรื่องของหัวข้อถัดไป
รหัสผ่านถูกเก็บยังไง
ประวัติแบ่งได้สี่ยุค
ยุคที่ 1 — Plaintext (ทศวรรษ 1960) เก็บรหัสผ่านเป็นข้อความธรรมดา เหตุการณ์ที่ MIT ปี 1961 คือ โปรแกรมเมอร์คนหนึ่งเผลอสั่งพิมพ์ไฟล์รหัสผ่านออกเครื่องพิมพ์ที่ใช้ร่วมกัน แล้วตั้งคำถามต่อว่า Can we do better?
ยุคที่ 2 — Hashing (ต้นทศวรรษ 1970) เก็บเป็นค่าที่ผ่าน One-way function (ฟังก์ชันทางเดียว) คือคำนวณไปข้างหน้าได้ แต่ย้อนกลับไม่ได้ และมีคำถามติดมาด้วยว่า deterministic ? ซึ่งเป็นคำใบ้ของปัญหาถัดไป
ยุคที่ 3 — Salted Hashing (ทศวรรษ 1980 เป็นต้นมา) ยุคนี้ถูกเรียกว่า the attacker's response และเป็นสิ่งที่จะได้ลองทำในกิจกรรม
ยุคที่ 4 — Slow, Adaptive Hashing (ทศวรรษ 2000 เป็นต้นมา) ชื่อที่ระบุไว้มีสามตัวคือ Bcrypt, Scrypt, Argon2 และอธิบายคุณสมบัติไว้ว่า ช้า กินหน่วยความจำมาก และแพงสำหรับผู้โจมตี แม้จะมีเครื่องแรง ๆ ก็ตาม
คำว่า deterministic ในยุคที่ 2 คือต้นเหตุของทุกอย่างที่ตามมา
ฟังก์ชันแฮชให้ผลเดิมกับค่าเดิมเสมอ ซึ่งจำเป็น ไม่งั้นตอนเรา login ระบบก็เทียบไม่ได้ แต่มันแปลว่า ทุกคนที่ตั้งรหัสผ่านว่า password จะมีค่าแฮชเหมือนกันหมด ผู้โจมตีจึงคำนวณค่าแฮชของคำยอดฮิตเก็บไว้ล่วงหน้าครั้งเดียว แล้วเอาไปเทียบกับฐานข้อมูลที่ขโมยมาได้ทุกอัน
Salt (ค่าสุ่มที่เติมให้แต่ละคนไม่ซ้ำกัน) แก้ตรงนี้ ด้วยการเติมค่าสุ่มคนละตัวก่อนแฮช คนสองคนที่ตั้งรหัสผ่านเหมือนกันจึงได้ค่าแฮชคนละอัน ตารางที่ทำไว้ล่วงหน้าก็ใช้ไม่ได้ทันที
ส่วนยุคที่ 4 แก้อีกด้านหนึ่ง คือแทนที่จะทำให้ตารางใช้ไม่ได้ ก็ทำให้ การคำนวณแต่ละครั้งช้าลง จนการไล่เดาไม่คุ้มค่าไฟ
คำนวณดูว่าเดาหมดต้องใช้เวลาแค่ไหน
ตัวแปรที่ตั้งไว้มีสี่ตัว
| ตัวแปร | ความหมาย |
|---|---|
n | ความยาวของรหัสผ่าน นับเป็นจำนวนตัวอักษร |
k | จำนวนตัวอักษรที่เป็นไปได้ในหนึ่งตำแหน่ง |
C | เวลาคงที่ที่ใช้ทดสอบรหัสผ่านหนึ่งครั้ง เช่น กี่วินาที |
t | จำนวนครั้งที่ระบบยอมให้เดาผิด ก่อนจะล็อกบัญชี |
แล้วถามว่า ถ้ารหัสผ่านยาว n ตัว แต่ละตัวเลือกจากชุดตัวอักษร k ตัว จะใช้เวลานานแค่ไหนถึงจะลองครบทุกความเป็นไปได้
จำนวนความเป็นไปได้ทั้งหมดคือ k ยกกำลัง n และเวลาที่ใช้ลองทุกอันคือ C × k^n
| ชุดตัวอักษร | k | n | จำนวนความเป็นไปได้ |
|---|---|---|---|
| ตัวเลขอย่างเดียว | 10 | 4 | 10,000 |
| ตัวพิมพ์เล็กอย่างเดียว | 26 | 8 | 208,827,064,576 |
| พิมพ์เล็ก พิมพ์ใหญ่ ตัวเลข | 62 | 8 | 218,340,105,584,896 |
| ทุกตัวที่พิมพ์ได้ | 95 | 8 | 6,634,204,312,890,625 |
| ทุกตัวที่พิมพ์ได้ | 95 | 12 | 540,360,087,662,636,962,890,625 |
สมมติว่าผู้โจมตีลองได้พันล้านครั้งต่อวินาที (C = หนึ่งในพันล้านวินาที)
| ชุดตัวอักษร | n | เวลาลองครบทุกอัน |
|---|---|---|
| พิมพ์เล็กอย่างเดียว | 8 | ประมาณ 3.5 นาที |
| พิมพ์เล็ก พิมพ์ใหญ่ ตัวเลข | 8 | ประมาณ 2.5 วัน |
| ทุกตัวที่พิมพ์ได้ | 8 | ประมาณ 77 วัน |
| ทุกตัวที่พิมพ์ได้ | 12 | ประมาณ 17 ล้านปี |
สังเกตสองแถวสุดท้าย ชุดตัวอักษรเท่ากัน ต่างกันแค่ความยาวจาก 8 เป็น 12 แต่เวลาต่างกันเป็นร้อยล้านเท่า ความยาวมีผลมากกว่าความซับซ้อน
แล้วตัวแปร t เอาไว้ทำอะไร
t คือจำนวนครั้งที่ยอมให้เดาผิดก่อนล็อกบัญชี มันเปลี่ยนโจทย์ไปคนละแบบ
ถ้าผู้โจมตีต้องเดาผ่านหน้า login จริง เขาจะไม่มีวันได้ลองครบ k^n ครั้ง เพราะโดนล็อกไปตั้งแต่ครั้งที่ t โอกาสที่เขาจะเดาถูกจึงเป็นแค่ t / k^n ซึ่งเล็กมาก
ตัวเลขในตารางข้างบนจึงใช้กับกรณีที่ ฐานข้อมูลรหัสผ่านถูกขโมยออกไปแล้ว เพราะตอนนั้นผู้โจมตีไล่เดากับเครื่องตัวเองได้ ไม่มีใครมาล็อกบัญชีเขา
นี่คือเหตุผลว่าทำไมทั้งการจำกัดจำนวนครั้ง (มาตรการในส่วนที่ 6) และการเลือกวิธีเก็บรหัสผ่านให้ดี (ยุคที่ 4 ในหัวข้อก่อนหน้า) ต้องมีทั้งคู่ อย่างละอย่างแก้คนละสถานการณ์
ส่วนที่ 5 — วิธีที่คนใช้เจาะรหัสผ่าน
วิธีเจาะมีห้าแบบ
| วิธี | ทำอะไร |
|---|---|
| Dictionary attack | ลองจากรายการคำที่คนนิยมใช้ ไม่ได้ลองทุกความเป็นไปได้ |
| Brute-force attack | ลองทุกความเป็นไปได้ตามสูตร k^n ในหัวข้อที่แล้ว |
| Rainbow table | เปิดตารางที่คำนวณค่าแฮชไว้ล่วงหน้าแล้ว |
| Replay attack | อัดข้อความที่คนอื่นส่ง แล้วส่งซ้ำเพื่อแอบอ้าง |
| Social Engineering (Phishing) | หลอกให้เจ้าตัวบอกรหัสผ่านมาเอง |
มีวิดีโอแนบไว้สองอันให้ไปดู
สี่วิธีแรกโจมตีที่ตัวระบบ วิธีที่ห้าโจมตีที่ตัวคน และเป็นวิธีที่ได้ผลที่สุด
รหัสผ่านที่ยาว 12 ตัวและเก็บด้วย Argon2 ต้องใช้เวลาเดาเป็นล้านปี แต่ถ้าเจ้าตัวพิมพ์มันลงในหน้าเว็บปลอมที่หน้าตาเหมือนของจริง ผู้โจมตีได้ไปในสามวินาที ไม่มีมาตรการทางเทคนิคข้อไหนกันเรื่องนี้ได้ทั้งหมด
Rainbow Table
หลักการทำงานเป็นขั้นแบบนี้
- รหัสผ่านถูกเก็บเป็นค่าที่ผ่านฟังก์ชันแฮชทางเดียว ในทางทฤษฎีย้อนกลับไม่ได้
- Rainbow Table (ตารางค่าแฮชที่คำนวณไว้ล่วงหน้า) คือการเอากำลังประมวลผลตอนที่เครื่องว่างมาคำนวณผลลัพธ์ที่เป็นไปได้ไว้ก่อน
- ผลคือเปลี่ยนจากการ ลองเดา เป็นการ เปิดตารางหา ซึ่งได้คำตอบทันที
ตารางหน้าตาแบบนี้ คือเริ่มจากรายการคำ aaa ถึง zzz คำนวณค่าแฮชของทุกคำ แล้วเก็บเป็นคู่ Hash : Plain เมื่อได้ค่าแฮช xyz มา ก็เปิดตารางแล้วรู้ทันทีว่าคำเดิมคือ abc
ลองด้วยตัวเอง
ลองเอาค่าแฮชของคำง่าย ๆ ไปค้นใน Google ดู ตัวอย่างที่ยกไว้มีสองคำ
$ echo "security" | md5
e46d69abde01f581f79cd4ec029a8469
$ echo "online" | md5
747a43298e195448246825207a9364b6แล้วยังบอกต่อว่า
- Rainbow table ดาวน์โหลดได้ฟรี ที่ project-rainbowcrack.com/table.htm
- ค่าพวกนี้เคยถูก search engine เก็บดัชนีไว้ด้วย
- ลองเอารหัสผ่านของตัวเองไปตรวจ ถ้าเจอในตาราง ให้เปลี่ยนรหัสผ่าน
คำสั่ง echo "security" เติมตัวขึ้นบรรทัดใหม่ต่อท้ายให้อัตโนมัติ ค่าที่ได้จึงเป็นค่าแฮชของ security\n ไม่ใช่ของ security เฉย ๆ
ทดสอบเทียบกันได้
$ printf 'security\n' | md5sum
e46d69abde01f581f79cd4ec029a8469
$ printf 'security' | md5sum
e91e6348157868de9dd8b25c81aebfb9ค่าแรกตรงกับที่สไลด์เขียนไว้ ถ้าจะแฮชข้อความล้วนโดยไม่มีตัวขึ้นบรรทัด ต้องใช้ echo -n หรือ printf แทน
บนเครื่อง Linux คำสั่งชื่อ md5sum ส่วนบน macOS ชื่อ md5
ลองตอบดู: ถ้าเว็บหนึ่งเก็บรหัสผ่านด้วย MD5 ที่เติม salt แล้ว rainbow table ยังใช้ได้ไหม
ใช้ไม่ได้
Rainbow table ทำงานได้เพราะค่าแฮชของคำเดียวกันเหมือนกันทุกครั้งและเหมือนกันทุกคน พอเติม salt ที่สุ่มคนละตัวต่อผู้ใช้หนึ่งคน ค่าแฮชของคำว่า password ของนาย ก. กับของนาย ข. ก็คนละค่ากันแล้ว ตารางที่ทำไว้ล่วงหน้าจึงเทียบไม่ตรงสักอัน
นี่คือเหตุผลที่ยุค salted hashing ถูกเรียกว่าเป็นคำตอบต่อการเคลื่อนไหวของฝ่ายโจมตี
แต่ salt ไม่ได้ทำให้ปลอดภัยเต็มร้อย ผู้โจมตีที่ได้ทั้งค่าแฮชและ salt ไป ยังไล่เดาทีละคนได้อยู่ เพียงแต่ต้องเริ่มใหม่ทุกคน แทนที่จะเปิดตารางเดียวถอดได้ทั้งฐานข้อมูล และนั่นคือเหตุผลที่ต้องมียุคที่ 4 ซึ่งทำให้การเดาแต่ละครั้งช้าลงด้วย
ส่วนที่ 6 — วิธีป้องกัน และเรื่องที่ยังไม่ได้พูดถึง
มาตรการมีสี่ข้อ
Multi-Factor Authentication
Multi-Factor Authentication (การพิสูจน์ตัวตนหลายชั้น) ย่อว่า MFA คือการใช้วิธีจากคนละกลุ่มในส่วนที่ 2 มาต่อกัน แบบเดียวกับตัวอย่าง SSH กับ crypto card ในส่วนที่ 3
สองตัวเลือกนี้มีเครื่องหมายคำถามติดมาทั้งคู่ คือ SMS? และ Authenticator Apps?
ทำไมเครื่องหมายคำถามถึงอยู่หลัง SMS
MFA ผ่าน SMS ยังดีกว่าไม่มีอะไรเลยมาก แต่มันอ่อนกว่าแอป authenticator ตรงที่รหัสวิ่งผ่านเครือข่ายโทรศัพท์ ซึ่งอยู่นอกการควบคุมของทั้งเราและเว็บที่เราใช้ ส่วนแอป authenticator คำนวณรหัสอยู่ในเครื่องเรา ไม่ต้องส่งผ่านตัวกลางใด
เครื่องหมายคำถามนั้นไม่มีคำอธิบายเขียนไว้ อ่านได้ว่าเป็นคำถามชวนคิดว่าสองอย่างนี้ให้ความปลอดภัยเท่ากันหรือไม่ ซึ่งคำตอบคือไม่เท่ากัน
Password Policies
กำหนดกติกาการตั้งรหัสผ่าน ต้องผสม ตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก ตัวเลข และสัญลักษณ์
ในสูตรของหน้า 35 นี่คือการเพิ่มค่า k จาก 26 เป็น 95
Rate Limiting และ Account Lockouts
จำกัดจำนวนครั้งที่เดาได้ และล็อกบัญชีเมื่อเดาผิดเกินกำหนด นี่คือตัวแปร t จากส่วนที่ 4 พร้อมคำแนะนำว่า See fail2ban
fail2ban คืออะไร
fail2ban เป็นโปรแกรมบนเซิร์ฟเวอร์ที่คอยอ่านไฟล์ log ของบริการต่าง ๆ เช่น SSH เมื่อเห็นว่ามี IP ไหนล็อกอินผิดซ้ำ ๆ เกินจำนวนที่ตั้งไว้ มันจะสั่ง firewall บล็อก IP นั้นชั่วคราว
fail2ban เป็นตัวอย่างของการทำ rate limiting ในทางปฏิบัติ
Human Factor
ทางแก้ที่ระบุไว้มีอย่างเดียวคือ Password Managers
กติกา password policy ในข้อ 2 สร้างปัญหาใหม่ขึ้นมาเอง คือรหัสผ่านที่ยาวและมั่วพอจนเดาไม่ได้ ก็เป็นรหัสผ่านที่คนจำไม่ได้เหมือนกัน
คนจึงแก้ปัญหาด้วยการใช้รหัสผ่านเดิมซ้ำทุกเว็บ ซึ่งแปลว่าเว็บเล็ก ๆ เว็บเดียวที่ถูกเจาะ ทำให้บัญชีอื่นทั้งหมดของเราถูกยึดตามไปด้วย
Password manager ตัดปมนี้ ด้วยการให้เราจำรหัสเดียว แล้วมันจำรหัสยาว ๆ ที่ไม่ซ้ำกันของทุกเว็บให้แทน
เรื่องที่คาบนี้ยังไม่ได้พูดถึง
บทนี้ปิดด้วยรายการหัวข้อที่ระบุไว้ตรง ๆ ว่า issues not covered in this slide ซึ่งเป็นการบอกขอบเขตของตัวเอง
| หัวข้อ | คำถามที่ค้างอยู่ |
|---|---|
| Management Cost | ระบบพิสูจน์ตัวตนหนึ่งระบบ ต้องจ่ายค่าดูแลเท่าไหร่ |
| Communication Channel | ช่องทางที่ใช้ส่งข้อมูลระหว่างพิสูจน์ตัวตนปลอดภัยแค่ไหน |
| Human Factor / Social Engineering | คนถูกหลอกได้เสมอ จัดการยังไง |
| Accuracy | ระบบตัดสินผิดได้แค่ไหน โดยเฉพาะ biometrics |
| Transferability | สิ่งที่ใช้พิสูจน์ตัวตน ส่งต่อให้คนอื่นได้หรือไม่ |
| Centralize vs. Distributed | เก็บข้อมูลตัวตนไว้ที่เดียว หรือกระจายไว้หลายที่ |
| Single Sign-On | ล็อกอินครั้งเดียวใช้ได้ทุกระบบ ดีหรือเสี่ยง |
หัวข้อพวกนี้ถูกทิ้งไว้เพราะเป็นเรื่องที่ตัดสินใจตอนออกแบบระบบจริง ไม่ใช่ตอนเรียนทฤษฎี
ยกตัวอย่าง Transferability กับ biometrics เราให้เพื่อนยืมรหัสผ่านได้ แต่ให้เพื่อนยืมลายนิ้วมือไม่ได้ ข้อนี้เป็นข้อดีเมื่อมองจากมุมความปลอดภัย และเป็นข้อเสียเมื่อมองจากมุมของคนที่ต้องมอบอำนาจให้คนอื่นทำแทน
นิยาม
- Authentication ในระบบคอมพิวเตอร์ = การยืนยันตัวตนของผู้ใช้ ในระบบสื่อสาร = การยืนยันว่าข้อความมาจากต้นทางที่อ้างจริง
- ทำได้สองแบบ คือตรวจของที่ถือมา (token) หรือตรวจคุณสมบัติของตัวมันเอง
- ใช้พิสูจน์ได้ทั้งเอกสาร คน ต้นทางของข้อมูล และความเป็นเจ้าของ
สามกลุ่มของวิธีพิสูจน์ตัวตน
- What do you know? — รหัสผ่าน passphrase คำถามที่นัดไว้ one-time pad challenge-response
- What do you have? — token, smart token, biometrics เก้าแบบ ตั้งแต่ลายนิ้วมือถึงจังหวะการพิมพ์
- Who do you trust? — Facebook / Google Login, ChulaSSO, และการเชื่อเพราะอยู่ในเขตที่ไว้ใจ
- ไม่มีวิธีไหนสมบูรณ์แบบ ทุกวิธีมีจุดอ่อนของตัวเอง
Protocol
- Authentication protocol = การเอาหลายวิธีมาต่อกัน เช่น รหัสผ่าน + smart token
- Challenge and response:
Alice > Bob : Nแล้วBob > Alice : {N,B}k—Nเปลี่ยนทุกครั้ง จึงกัน replay attack ได้ - ZKPP = พิสูจน์ว่ารู้รหัส โดยไม่ต้องบอกรหัส ตัวอย่างคือ Where is Waldo และเด็กกับอุโมงค์
- ระบบพิสูจน์ตัวตนสมัยใหม่ตั้งอยู่บน ZKPP
รหัสผ่าน
- มีเครื่องหมายคำถามกำกับทั้งสองฝั่ง — Substitution (Good?) กับ Guessable pattern (Bad?)
- สี่ยุคของการเก็บ: Plaintext (1960s), Hashing (1970s), Salted hashing (1980s+), Slow adaptive hashing (2000s+ คือ bcrypt, scrypt, Argon2)
- ตัวแปรสี่ตัว:
nความยาว,kขนาดชุดตัวอักษร,Cเวลาต่อการลองหนึ่งครั้ง,tจำนวนครั้งก่อนล็อกบัญชี - จำนวนความเป็นไปได้ =
k^nและเวลาลองครบ =C × k^n— ความยาวมีผลมากกว่าความซับซ้อน
วิธีเจาะ
- Dictionary attack, Brute-force, Rainbow table, Replay attack, Social engineering (phishing)
- Rainbow table = คำนวณค่าแฮชไว้ล่วงหน้าตอนเครื่องว่าง เปลี่ยนการเดาให้เป็นการเปิดตาราง
- ดาวน์โหลดได้ฟรี และค่าแฮชของคำง่าย ๆ เคยค้นเจอใน search engine
- salt ทำให้ rainbow table ใช้ไม่ได้ เพราะค่าแฮชของคำเดียวกันไม่ซ้ำกันอีกต่อไป
วิธีป้องกัน
- Multi-Factor Authentication (SMS? Authenticator apps?)
- Password policy — ผสมพิมพ์ใหญ่ พิมพ์เล็ก ตัวเลข สัญลักษณ์
- Rate limiting และ account lockout — แนะนำ fail2ban
- Password manager สำหรับปัญหาฝั่งคน
- เรื่องที่ยังไม่ได้พูด: ค่าดูแลระบบ, ช่องทางสื่อสาร, human factor, ความแม่นยำ, การส่งต่อสิทธิ์, รวมศูนย์หรือกระจาย, และ single sign-on