neungkl
Published in

neungkl

ทำไม Facebook เวลาเราลืมรหัสผ่าน แล้วมันไม่ยอมบอกรหัสเราเลยล่ะ ?

กรณีอย่างนี้ไม่ใช่แค่กับเว็บ Facebook อย่างเดียวนะครับ แต่จะเห็นว่ามีหลายๆเว็บที่บังคับให้เราในการ Reset รหัสผ่าน แทนที่จะเป็นการบอกรหัสเราในกรณีที่เราลืม

แม้ว่าจะมีการส่ง Email กลับไปยัง Email ส่วนตัวของเราเพื่อให้เรา Reset รหัสผ่าน แต่สิ่งที่ยังน่าฉงนใจอยู่คือ ทำไมเว็บไซต์เหล่านั้นไม่ยอมส่งรหัสผ่านมาทาง Email แทนที่จะให้ Reset รหัสผ่าน หรือจะกลัวว่าคนอื่นจะแอบมาดู Email ของเราอย่างนั้นหรือ?

Security

ตรงมาตรงมาก็เพื่อความปลอดภัยครับ คำถามต่อมาคือการให้ Reset รหัสผ่านมันช่วยเพิ่มความปลอดภัยอย่างไร

สมมุติคนเป็น Hacker ที่เก่งกาจมาก
อยู่มาวันหนึ่ง คนสามารถแฮกเข้าที่เว็บไซต์ Facebook ได้
และแล้วคุณก็เห็นข้อมูลทั้งหมด
เห็นข้อมูลทุกคน
เห็น Email ที่คุณใช้ในการ Log in
ซ้ำร้ายไปกว่านั้นคือเห็นรหัสผ่านด้วย

Oh goddd… ถ้าหากมีกรณีอย่างนี้เกิดขึ้น Facebook คงต้องให้ทุกๆคนที่ใช้บริการ Facebook เปลี่ยน Password กันโดยพลัน

เพราะฉะนั้นสิ่งที่ Facebook ทำคือการเก็บ Password ในรูปแบบอื่น รูปแบบที่ไม่สามารถมีใครอ่านออกได้ และสิ่งนั้นมันสามารถยืนยันได้ว่า Password ที่เรากรอกมานี้มันถูกนะ มันไม่ได้ปลอมแปลงนะ

กระบวนการ Log in

ลองทบกวนกันอีกครั้งว่า ก่อนที่คุณจะเข้า Facebook นั้น คุณใช้มันอย่างไร

อันดับแรกก็เริ่มจากกรอก Username หรือ Email ของคุณ
ขั้นถัดมาก็เริ่มกรอก Password

คลิก Log in ก็เป็นอันเสร็จพิธี

ยังจำได้รึเปล่าที่ผมบอกว่า Facebook จะเก็บ Password เราในรูปแบบอื่น
รูปแบบที่ไม่มีใครอ่านออก ???

รูปแบบที่ Facebook จะเก็บ Password นั้นจะต้องมีคุณสมบัติดังนี้

  1. จะต้องไม่เก็บเป็น Plain Text หมายความว่าตัว Password จะไม่ถูกเก็บลงๆไปตรงๆ เช่น Password ของคุณคือ ilikeacat สิ่งที่ Facebook เก็บจะต้องไม่เป็น ilikeacat เพื่อป้องกันการ Hack
  2. จะต้องยืนยันได้ว่า Password ที่ผู้ใช้ป้อนเข้ามานั้นถูกต้อง
  3. มันไม่สามารถย้อนรอยได้ หรือใช้วิธีแปลงผ่านกระบวนการบางอย่าง เพื่อกลับไปหา Password ตั้งต้นได้ เช่น Password ของคุณคือ ilikeacat ข้อมูลที่ Facebook จะเก็บนั้น ไม่ว่าคุณจะงัดแงะประกอบแกะยังไง ก็หาทางที่กลับไปเป็น ilikeacat ไม่ได้

ซึ่งรูปแบบข้อมูลที่ Facebook เอามาเก็บเพื่อมาเป็น ตัวแทน ของรหัสผ่านที่มีคุณสมบัติตรงตามทั้ง 3 ข้อนั้นมีชื่อว่า…

Message Digest

Message Digest นั้นเปรียบเสมือน ตัวแทน รหัสผ่านของ Facebook ของเรา ซึ่งกระบวนนั้นเรามองอย่างง่ายๆ ก็มองได้ว่าเป็นกระบวนการอย่างหนึ่ง ที่นำรหัสของเรานั้นมาย่อยให้กลายเป็นข้อความบางอย่างที่มั่วซั่วไปหมด

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

ผมจะขอเปลี่ยนคำว่า เข้ารหัส เปลี่ยนเป็นคำว่า Hash ละกันครับ

กระบวนการนี้ มองอย่างคร่าวๆก็คือ สมมุติผมตั้งรหัสว่า KosateIsHandsome และรหัสตัวนี้จะไปถูกแปลงเป็นข้อความอีกอย่าง เช่น f32f827c0d5de2f0099f41185c9f57d1 เราจะเรียกตัวที่แปลงนี้ว่า Message Digest

จะเห็นได้ว่า การเก็บรหัสผ่านในรูปแบบนี้ จะผ่านกฏข้อที่ 1 ที่กล่าวว่า ตัวรหัสจะต้องไม่เป็น Plain Text ไปที่เรียบร้อยแล้ว

แล้วข้อที่ 2 ละ ?

Hashing

Hash เป็นกระบวนการทางคณิตศาสตร์ ที่นักคณิตศาสตร์ได้เริ่มคิดค้นมาเป็นหลาย 10 ปี จนได้เป็นกระบวนการอันน่าเหลือเชื่อ ที่ทำให้กระบวนการ Hash มีความปลอดภัย

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

หมายความว่าอย่างไร ?

สมมุตินายแมว ตั้งรหัสชื่อ A แล้วคุณทำการ Hash ตัวรหัส A จนได้เป็นข้อความว่า 123 นายหมาน้อย ตั้งรหัสชื่อ B แล้วคุณทำการ Hash ตัวรหัส B จนได้เป็นข้อความว่า 124 นายนก ได้ตั้งรหัสบางอย่าง ไม่บอกให้ใครรู้ เมื่อคุณทำการ Hash รหัสของนายนก ได้ข้อความออกมาว่า 125

คุณพอจะเดาออกหรือไม่ว่านายนกตั้งรหัสว่าอะไร?

เพราะฉะนั้นกระบวนการ Hash จึงเป็นกุญแจหลักสำคัญในการเพิ่มความปลอดภัยให้แก่รหัสผ่านของคุณ ผมจะยกตัวอย่างกระบวนการ Hash ที่ชื่อว่า SHA-1

สามารถลองไปเล่นได้ที่ http://www.sha1-online.com/

เมื่อคุณนำ A เข้าไป Hash จะได้ออกมาเป็น 6dcd4ce23d88e2ee9568ba546c007c63d9131c1b
และเมื่อนำ B ไป Hash จะได้ออกมาเป็น
ae4f281df5a5d0ff3cad6371f76d5c29b6d953ec

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

กฏข้อที่ 2

กลับมาตอบคำถามหลัก ว่ากระบวนการ Hash เกี่ยวข้องอย่างไรกับการยืนยันว่า Password นั้นถูกต้อง

สั้นๆเลยครับ เอา Password ไป Hash ก็จะได้ Message Digest ออกมา แทนที่เราจะตรวจสอบ Password โดยตรง (ความปลอดภัยต่ำ) เราก็ตรวจสอบบน Message Digest เลยครับ

เช่น นายแมวเหมียวตั้งรหัสว่า ABC เอาไป Hash ได้ออกมาเป็น 3c01bdbb26f358bab27f267924aa2c9a03fcfdb8 ก็นำ Message Digest นี้ไปเก็บไว้ลงบน Facebook

และเมื่อถึงขั้นตอนที่ต้อง Log in นายแมวเหมียวก็ป้อนรหัสผ่านว่า ABC ตามปกตินั่นแหละ แต่ Facebook จะเอา ABC ไป Hash ก่อนจนกลายเป็น Message Digest แล้วค่อยเทียบตัวที่เก็บไว้อีกที

พูดให้กระชับง่ายๆคือ แทนที่คุณจะเปรียบเทียบ Password ว่าตรงกันหรือไม่ ก็เปรียบเทียบว่า Message Digest ตรงกันหรือไม่

  1. ตอนที่คุณสมัคร Facebook นั้น Facebook จะให้คุณกรอก Password ซึ่งตัว Password จะถูก Hash กลายเป็น Message Digest ที่ชื่อว่า MdB
  2. เมื่อคุณ​ Login ใหม่อีกครั้ง Facebook จะ Hash Password ของคุณที่ป้อนเข้ามาตอน Login ได้ชื่อว่า MdA
  3. Facebook จะเปรียบเทียบว่ารหัสผ่านที่คุณกรอกตอนสมัคร กับ ตอน Log in เหมือนกันหรือไม่ โดยเปรียบเทียบโดยใช้ Message Digest 2 ตัวคือ MdA กับ MdB
  4. ถ้าเหมือนกันก็ใช้ Facebook ก็จะผ่านกระบวนการ Log in และคุณก็ใช้ Facebook ตามปกติเลยยย

กฏข้อที่ 3

ครั้งแรกที่ผมบอกว่า ผมไม่เคยอยากใช้คำว่า เข้ารหัส สักเท่าไหร่ เพราะว่าเมื่อมีคำว่า เข้ารหัส มักจะมีคำว่า ถอดรหัส ออกมาด้วย

ผมเลยเปลี่ยนเป็นคำว่า Hash ซึ่งกระบวนการของตัวนี้เองนั้น เป็นกระบวนการที่ทำย้อนกลับไม่ได้อยู่แล้วครับ

อันที่จริง เข้าออกแบบมาเพื่อทำให้ย้อนกลับไม่ได้อยู่แล้วครับ สมมุติว่าวันหนึ่งคุณขโมย Message Digest มาได้ แล้วคุณพบว่ามีวิธีที่สามารถแปลง Message Digest ให้กลายเป็นรหัสผ่านตามปกติได้

แล้วอย่างนั้นก็แทบไม่มีประโยชน์เลยที่เราต้องใช้ Message Digest และการ Hashing

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

ซึ่งสาเหตุที่แปลงกลับไม่ได้ ก็เพราะการคำนวณทางคณิตศาสตร์และการออกแบบอย่างชาญฉลาดของการทำ Hashing ครับ ถ้าอธิบายคร่าวๆก็สมมุติคุณมีกระบวนการทางคณิตศาสตร์อย่างง่ายๆ

นั่นก็คือเอา 2 เลขบวกกันเช่น 123 + 581 = 704 และหากจะทำย้อนกลับก็ไล่ทุกเลขเลยครับเช่น

63 + 641 = 704
593 + 111 = 704
412 + 292 = 704

จะเห็นว่าแค่การบวกเลข 2 ตัว หากจะทำย้อนกลับก็มีความเป็นไปถึง 704 แบบ

ซึ่งกระบวนการ Hash ก็มีพื้นฐานมาจากกระบวนการทางคณิตศาสตร์ขั้นพื้นฐาน เพียงแต่ว่ามีเป็นกระบวนการที่ทำซ้ำหลายๆรอบ และแต่ละรอบนั้นก็มีการใช้ข้อมูลจากรอบเก่าๆ เพื่อมาช่วยในการคำนวณรอบใหม่

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

อ่านเพิ่มเติมได้ที่ https://crypto.stackexchange.com/a/45390

วิธีนี้ปลอดภัยจริงหรือ?

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

เช่น กรณีแรกคือ Hash แล้วข้อมูลชนกันบ่อย

ยกตัวอย่างเช่น นายนกใช้รหัสผ่านชื่อ Apple ได้ Hash ออกมาเป็น hf0263 และนายเอกใช้รหัสผ่านชื่อ Orange ได้ Hash ออกมาเป็น hfo263 เหมือนกัน

ความอันตรายอยู่ที่ ถ้านายเอกเผลอกรอกรหัส Orange ลงบนเครื่องคอมพิวเตอร์ของนายนก ก็จะเข้าได้ทันที เพราะว่า Message Digest ดันเหมือนกัน

ดังนั้นการ Hash ข้อมูลต้องชนกันน้อยที่สุดเท่าที่เป็นไปได้ (ไม่ชนกันเลยยิ่งดี)

กรณีที่ 2 คือ Hash แล้วควรจะแกะรูปแบบไม่ได้ ตามที่อธิบายไปแล้วว่า

นายนกใช้รหัส A ได้ Hash เป็น 123 นายแมวใช้รหัส B แล้ว Hash ได้ 124
เรารู้ว่านายหมูมี Hash เป็น 125 ก็พอเดาออกได้ว่ารหัสนายหมูคือ C

กรณีที่ 3 คือ Hash แล้วต้องทำย้อนกลับไม่ได้

จะเห็นว่าวิธีนี้จะช่วยตอบโจทย์รูปแบบการเก็บรหัสผ่านได้ทั้งหมด อีกทั้งยังปลอดภัยมากๆด้วย

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

ซึ่งก็ตอนนี้ก็มี SHA-1, SHA-256, BLAKE-256, … ที่นิยมกัน (ตระกูล MD5 ไม่ปลอดภัยแล้วนะครับสำหรับปัจจุบันนี้) สามารถเข้าไปดูอันอื่นๆได้ที่ https://en.wikipedia.org/wiki/List_of_hash_functions

คำถามเดิม

แล้วทำไม Facebook ต้องส่งให้เรา Reset รหัสผ่านละ

ก็เพราะว่าสิ่งที่ Facebook เก็บนั้นเป็น Message Digest ที่ไม่สามารถทำกระบวนการย้อนกลับเป็น Password แบบเดิมได้ จึงทำให้ Facebook ไม่ส่ง Password มาหาเรา แต่ส่งให้เรามา Reset รหัสผ่านนั่นเองง !!

ซึ่งไม่ใช่เพียงแค่ Facebook เว็บเดียวเท่านั้นที่ใช้เทคนิคเหล่านี้

แต่ก็ยังมีเว็บชั้นนำอีกมากไม่ว่าจะเป็น Google, Twitter, Amazon, Airbnb, Steam, … ที่ล้วนแล้วใช้กระบวนการใกล้เคียงกับเหล่านี้ทั้งสิ้น

เบื้องหลังอาจจะมีกระบวนการลึกลับซับซ้อนซ้อนอยู่ แต่โดยปัจจัยสำคัญก็คร่าวๆเกี่ยวข้องกับเรื่อง Hashing และ Message Digest ทั้งนั้นครับ

ขอบคุณที่อ่านจนจบครับ หากสงสัยอะไรสามารถคอมเม้นท์เพิ่มเติมได้ด้านล่างเลยครับ

--

--

A programmer who loves to code.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store