ข้ามไปที่เนื้อหา
CEDTAN

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.

ทุกวิธีมีทั้งจุดแข็งและจุดอ่อนของตัวเอง และไม่มีสิ่งที่เรียกว่าวิธีพิสูจน์ตัวตนที่สมบูรณ์แบบ

ไม่มีวิธีไหนสมบูรณ์แบบ ทุกวิธีมีทั้งจุดแข็งและจุดอ่อนWhat do you know?สิ่งที่คุณรู้รหัสผ่าน / passphraseคำถามที่นัดกันไว้one-time padchallenge-responseจุดอ่อน: ถูกเดาได้What do you have?สิ่งที่คุณถือบัตร ตรา (token)smart tokenลายนิ้วมือ ม่านตาเสียง จังหวะพิมพ์จุดอ่อน: ทำหาย ถูกปลอมWho do you trust?คนที่คุณเชื่อFacebook / Google LoginChulaSSOอยู่ในเขตที่ไว้ใจแต่งตัวเหมือนนิสิตจุดอ่อน: เชื่อคนกลาง
รูปที่ 1: สามกลุ่มของวิธีพิสูจน์ตัวตน พร้อมจุดอ่อนประจำกลุ่ม

กลุ่มที่ 1 — What do you know? สิ่งที่คุณรู้

A secret between two is God's secret, a secret between three is everybody's.

— Spanish Proverb (ความลับที่รู้กันสองคนคือความลับของพระเจ้า ความลับที่รู้กันสามคนคือความลับของทุกคน)

สุภาษิตนี้บอกจุดอ่อนของทั้งกลุ่มไว้แล้ว ความลับที่ต้องบอกให้อีกฝ่ายรู้ ก็ไม่ใช่ความลับอีกต่อไป

กลุ่มนี้มีสี่วิธี

  1. Prearranged questions — คำถามที่นัดกันไว้ล่วงหน้า
  2. Password หรือ Passphrase — รหัสผ่านหรือวลีรหัสผ่าน
  3. One-time pad — รหัสที่ใช้ครั้งเดียวแล้วทิ้ง
  4. Challenge and Response — ฝ่ายหนึ่งตั้งโจทย์ อีกฝ่ายตอบ ตัวอย่างโจทย์คือ How much is 1+1 ?

ที่มาของวิธีนี้คือ ในอดีตทหารอเมริกันต้องนัดคำถามไว้กับกองทัพล่วงหน้า เพื่อใช้ยืนยันตัวเองในกรณีฉุกเฉิน

Challenge and Response ทำงานยังไง

ขั้นตอนเขียนไว้สองบรรทัด

Alice > Bob : N
Bob > Alice : {N,B}k
AliceBobN — เลขสุ่มที่ใช้ครั้งเดียว{N, B}k — เข้ารหัสด้วยกุญแจที่รู้กันสองคนAlice ถอดรหัสแล้วต้องได้ N ตัวเดิม จึงรู้ว่าอีกฝั่งมีกุญแจจริงN เปลี่ยนทุกรอบ คนที่อัดข้อความเก่าไปเล่นซ้ำจึงใช้ไม่ได้ (replay attack)รีโมทกุญแจรถสมัยนี้ใช้วิธีนี้
รูปที่ 2: Alice ตั้งโจทย์ด้วยเลขสุ่ม Bob ตอบกลับมาในรูปที่เข้ารหัสไว้

อ่านทีละบรรทัด

  • บรรทัดแรก 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 เจอจริง

ภาพที่สอง — เด็กกับอุโมงค์ อธิบายละเอียดกว่า

Zero-Knowledge Password Proof — พิสูจน์ว่ารู้ โดยไม่ต้องบอกว่ารู้อะไรทางเข้าทางซ้ายทางขวาประตูล็อกต้องมีกุญแจเราไม่เห็นว่าเธอเดินเข้าทางไหน แล้วตะโกนบอกให้ออกทางที่เราเลือกทำซ้ำหลายรอบ ถ้าออกถูกทุกครั้ง แปลว่ามีกุญแจจริง โดยไม่ต้องบอกกุญแจให้เรารู้
รูปที่ 3: อุโมงค์วงกลมที่มีประตูล็อกอยู่ปลายทาง จะออกทางที่ถูกได้ทุกรอบก็ต่อเมื่อมีกุญแจ

โจทย์คือ พิสูจน์ว่าเด็กคนนั้นมีกุญแจของประตูที่อยู่ปลายอุโมงค์ โดยเราไม่ต้องเห็นกุญแจ

ขั้นตอนมีดังนี้

  1. ให้เด็กเดินเข้าไปในอุโมงค์ โดยเราไม่เห็นว่าเธอเลือกทางไหน
  2. เราขอให้เธอออกมาทางที่เราสุ่มเลือก
  3. ทำซ้ำหลายรอบ
  4. ถ้าเธอออกมาถูกทางทุกครั้ง แปลว่าเธอมีกุญแจจริง
เทียบให้เห็นภาพ

ถ้าเธอไม่มีกุญแจ เธอเดาได้แค่ว่าเราจะเรียกทางไหน แล้วเดินเข้าไปทางนั้น

รอบเดียวเธอมีโอกาสรอด 50% สองรอบเหลือ 25% สิบรอบเหลือประมาณหนึ่งในพัน ยิ่งทำซ้ำมาก โอกาสที่คนไม่มีกุญแจจะฟลุกผ่านทุกรอบก็ยิ่งเข้าใกล้ศูนย์ ในขณะที่คนมีกุญแจผ่าน 100% ทุกรอบเสมอ

จุดสำคัญคือ ตลอดทั้งกระบวนการ เราไม่เคยเห็นกุญแจเลย เรารู้แค่ว่าเธอมี

ข้อสรุปของหัวข้อนี้คือ Modern authentications are based on ZKPP คือระบบพิสูจน์ตัวตนสมัยใหม่ตั้งอยู่บนแนวคิดนี้


ส่วนที่ 4 — รหัสผ่านแข็งแรงแค่ไหน

ส่วนนี้เปิดด้วยประโยคว่า

We still rely on Username/Password, but how strong is it?

เรายังพึ่งชื่อผู้ใช้กับรหัสผ่านอยู่ แต่มันแข็งแรงแค่ไหนกัน

รหัสผ่านแบบไหนดี แบบไหนไม่ดี

สองคอลัมน์นี้มีเครื่องหมายคำถามกำกับทั้งสองฝั่ง

Guessable pattern (Bad?) — รูปแบบที่เดาได้
  • Qwerty
  • Q1w2e3r4t5y
  • Password1
  • Password2

ทั้งสี่อันเดินตามรูปแบบที่คนใช้กันเยอะ คือแถวแป้นพิมพ์ และคำว่า password ต่อด้วยเลข

Substitution (Good?) — การแทนตัวอักษร
  • act10n
  • 0wn3r
  • 4U&m3
  • p3nc1l

ทั้งสี่อันแทนตัวอักษรด้วยเลขหรือสัญลักษณ์ที่หน้าตาคล้ายกัน เช่น o เป็น 0 และ e เป็น 3

จุดที่คนพลาดบ่อย

สังเกตว่าทั้งสองหัวข้อมีเครื่องหมายคำถามติดมาด้วย คือ Substitution (Good?) และ Guessable pattern (Bad?) จึงไม่ได้ฟันธงว่าฝั่งซ้ายดีจริง

เหตุผลอยู่ในส่วนที่ 5 คือ dictionary attack สมัยนี้ไม่ได้ลองแค่คำในพจนานุกรม แต่ลองคำที่ผ่านการแทนตัวอักษรแบบนี้ด้วย p3nc1l จึงไม่ได้แข็งแรงกว่า pencil มากอย่างที่คนคิด สิ่งที่ช่วยจริงคือความยาว ซึ่งเป็นเรื่องของหัวข้อถัดไป

รหัสผ่านถูกเก็บยังไง

ประวัติแบ่งได้สี่ยุค

1960sPlaintextไฟล์หลุดเมื่อไหร่เห็นรหัสผ่านเลย1970sHashทางเดียว ถอดไม่ได้แต่ค่าเดิมได้ผลเดิม1980s+Salted hashเติมค่าสุ่มต่อคนตารางสำเร็จรูปพัง2000s+Slow hashช้าและกินหน่วยความจำเดาแล้วไม่คุ้มแต่ละยุคเกิดขึ้นเพราะยุคก่อนหน้าถูกเจาะจนใช้ไม่ได้ยุคปัจจุบันคือ bcrypt, scrypt และ Argon2 ที่ตั้งใจออกแบบให้ช้า
รูปที่ 4: สี่ยุคของการเก็บรหัสผ่าน แต่ละยุคเกิดขึ้นเพราะยุคก่อนหน้าถูกเจาะ

ยุคที่ 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

ชุดตัวอักษรknจำนวนความเป็นไปได้
ตัวเลขอย่างเดียว10410,000
ตัวพิมพ์เล็กอย่างเดียว268208,827,064,576
พิมพ์เล็ก พิมพ์ใหญ่ ตัวเลข628218,340,105,584,896
ทุกตัวที่พิมพ์ได้9586,634,204,312,890,625
ทุกตัวที่พิมพ์ได้9512540,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

หลักการทำงานเป็นขั้นแบบนี้

  1. รหัสผ่านถูกเก็บเป็นค่าที่ผ่านฟังก์ชันแฮชทางเดียว ในทางทฤษฎีย้อนกลับไม่ได้
  2. Rainbow Table (ตารางค่าแฮชที่คำนวณไว้ล่วงหน้า) คือการเอากำลังประมวลผลตอนที่เครื่องว่างมาคำนวณผลลัพธ์ที่เป็นไปได้ไว้ก่อน
  3. ผลคือเปลี่ยนจากการ ลองเดา เป็นการ เปิดตารางหา ซึ่งได้คำตอบทันที
Rainbow table เปลี่ยนการเดา ให้กลายเป็นการเปิดตารางรายการคำaaa … zzzคำนวณไว้ก่อนHash : Plainxyz : abczzz : aaa…เปิดดูได้ค่าแฮช xyz มารู้ทันทีว่าคือ abcงานหนักถูกย้ายไปทำล่วงหน้าตอนเครื่องว่าง เหลือแค่การค้นหาตอนลงมือวิธีแก้คือ salt — เติมค่าสุ่มต่อคนก่อนแฮช ตารางที่ทำไว้จึงใช้ไม่ได้
รูปที่ 5: งานหนักถูกย้ายไปทำล่วงหน้า เหลือแค่การเปิดตารางตอนลงมือ

ตารางหน้าตาแบบนี้ คือเริ่มจากรายการคำ 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

เกริ่นนำ0%

ข้ามไปสรุป

On this page

คาบนี้จะพาไปไหนส่วนที่ 1 — Authentication คืออะไรนิยามสองมุมเอาไปพิสูจน์อะไรได้บ้างส่วนที่ 2 — วิธีพิสูจน์ตัวตนสามกลุ่มกลุ่มที่ 1 — What do you know? สิ่งที่คุณรู้Challenge and Response ทำงานยังไงกลุ่มที่ 2 — What do you have? สิ่งที่คุณถือกลุ่มที่ 3 — Who do you trust? คนที่คุณเชื่อส่วนที่ 3 — เอาหลายวิธีมาต่อกันเป็น ProtocolZero-Knowledge Password Proofส่วนที่ 4 — รหัสผ่านแข็งแรงแค่ไหนรหัสผ่านแบบไหนดี แบบไหนไม่ดีรหัสผ่านถูกเก็บยังไงคำนวณดูว่าเดาหมดต้องใช้เวลาแค่ไหนส่วนที่ 5 — วิธีที่คนใช้เจาะรหัสผ่านRainbow Tableลองด้วยตัวเองส่วนที่ 6 — วิธีป้องกัน และเรื่องที่ยังไม่ได้พูดถึงMulti-Factor AuthenticationPassword PoliciesRate Limiting และ Account LockoutsHuman Factorเรื่องที่คาบนี้ยังไม่ได้พูดถึงสรุปท้ายคาบ