ช่วงสองสามปีที่ผ่านมาปัญหาบัญชีถูกแฮกยังคงเป็นปัญหาใหญ่ของระบบความปลอดภัยจำนวนมาก แม้บริการต่างๆ จะพยายามต่อสู้กับการโจมตีบัญชีผู้ใช้ช่องทางต่างๆ ทั้งการเปิดการล็อกอินสองขั้นตอน หรือการตั้งกฎรหัสผ่านให้ยากขึ้นเรื่อยๆ แม้ว่า NIST จะบอกให้เลิกตั้งกฎไปแล้ว ขอแค่อย่าใช้รหัสที่เคยหลุดมาแล้วก็พอก็ตามที แต่ผลสุดท้ายเรายังเห็นผู้ใช้ตั้งรหัสผ่านซ้ำกันไปมา ไม่ยอมเปิดใช้ฟีเจอร์ล็อกอินสองขั้นตอนหากไม่ใช่บัญชีองค์กรที่บังคับ หรือหากบังคับก็จะเลือกช่องทางที่สะดวกที่สุด เช่น SMS แต่ปลอดภัยน้อยที่สุด
ปัญหาของรหัสผ่านนั้นมีสองประเด็นใหญ่ ข้อแรกคือคนร้ายอาจจะล่วงรู้รหัสผ่านไม่ว่าด้วยวิธีการใดก็ตาม เช่น ผู้ใช้ตั้งรหัสผ่านที่เดาได้ง่าย หรือผู้ใช้ตั้งรหัสผ่านที่ซ้ำกันไปทั้งหมด ทำให้เมื่อเจาะรหัสผ่านจากบริการใดๆ ก็เข้าใช้บริการอื่นๆ ได้ทันที ข้อที่สองคือคนร้ายอาจจะหลอกล่อให้ผู้ใช้ใส่รหัสผ่านกับเว็บปลอม, แอปปลอม, หรือแม้กระทั่งหลอกให้เหยื่อบอกทางโทรศัพท์หรือแชทเอาตรงๆ โดยปลอมตัวว่าเป็นเจ้าหน้าที่ที่เกี่ยวข้อง
การเปิดใช้งานการล็อกอินหลายขั้นตอน (multi-factor authentication - MFA) นั้นสามารถช่วยตัดวงการโจมตีแบบแรกไปได้ นั่นคือแม้ว่าคนร้ายจะรู้รหัสผ่านของเหยื่อไม่ว่าช่องทางใดๆ แต่ก็ไม่สามารถล็อกอินสำเร็จ แต่พอเป็นการโจมตีที่แบบที่สอง แม้จะโจมตีได้ยากกว่าแต่ผู้ใช้กลุ่มที่เปิดล็อกอินสองขั้นตอนก็มักเป็นเหยื่อที่มูลค่าสูง เช่น ใช้งานบัญชีคริปโต หรือมีบัญชีเข้าถึงระบบขององค์กรขนาดใหญ่
ช่วงปี 2015 กูเกิลและ Yubico ร่วมกันพัฒนาโปรโตคอล U2F เพื่ออาศัยการยืนยันว่าผู้ใช้มีกุญแจ USB อยู่ในมือเป็นการล็อกอินขั้นที่สอง โดยจุดเด่นสำคัญคือเบราว์เซอร์จะส่งข้อมูล URL ของเว็บที่ล็อกอินไปยัง URL ด้วย ทำให้คนร้ายไม่สามารถใช้เว็บฟิชชิ่ง (phishing) เพื่อสร้างเว็บคล้ายกับเว็บจริงแล้วหลอกให้คนเหยื่อใส่รหัสผ่านหรือ OTP ได้อีกต่อไป เพราะกุญแจ U2F จะไม่ตอบหากพบว่ากุญแจไม่ตรงกับที่เคยล็อกอินไว้ก่อนหน้า โดยมาตรฐานนี้ดูแลโดยองค์กรกลางคือ FIDO Alliance
กุญแจ FIDO สามารถสร้างด้วยกุญแจ USB, หรือใช้ชิปเข้ารหัสในโทรศัพท์หรือพีซีก็ได้
หลังจากนั้น FIDO ก็ทำงานร่วมกับผู้ผลิตฮาร์ดแวร์จำนวนมาก เปิดทางให้โน้ตบุ๊กหรือโทรศัพท์สามารถใช้งานแทนกุญแจ USB ได้โดยตรง ผู้ใช้ไม่ต้องซื้อกุญแจ USB เพิ่มเติมแต่ก็แปลว่าต้องล็อกอินบนอุปกรณ์ที่เคยลงทะเบียนไว้เท่านั้น การใช้งานอาจจะสะดวกขึ้นหลายกรณี เช่น มีกุญแจ USB ที่ลงทะเบียนกับบริษัทไว้แล้ว แต่ลงทะเบียนด้วยโน้ตบุ๊กเป็นกุญแจไว้ด้วย หากวันไหนพกโน้ตบุ๊กไปทำงานก็ไม่จำเป็นต้องพกกุญแจ USB ไป แม้จะลดความยุ่งยากลงเล็กน้อยแต่ก็ยังนับว่าใช้งานยากกับคนจำนวนมากอยู่ดี และ FIDO ส่งมาตรฐานกลางเข้า W3C จนกลายเป็นมาตรฐาน WebAuthn ทุกวันนี้ โดยรองรับทั้งการใช้สำหรับการล็อกอินขั้นที่สอง หรือการล็อกอินโดยไม่ใช้รหัสผ่านอีกเลย
Passkey เป็นการแก้ปัญหาความยุ่งยากลง เพราะแต่เดิมนั้นผู้ใช้มีความกังวลเรื่องกุญแจสูญหาย ไม่ได้พกกุญแจเมื่อต้องการใช้งาน หรือความน่ารำคาญสำคัญ คือกุญแจที่ต้องการใช้งานกลับไม่สามารถใช้งานกับเครื่องที่ต้องการล็อกอินได้ เพราะพอร์ตไม่ตรงกัน ตัวกุญแจอาจจะเป็น USB A ขณะที่เครื่องที่ต้องการล็อกอินกลับเป็นพอร์ต USB-C หรือ Lightning การใช้งานกุญแจ FIDO แบบ Bluetooth นั้นยุ่งยากและหลายครั้งอาจจะเชื่อมต่อลำบาก โดย Passkey เน้นการใช้โทรศัพท์ (หรืออาจจะเป็นแอปอื่น) เข้ามาทำหน้าที่แทนกุญแจ USB ใน FIDO/WebAuthn พร้อมกับปรับปรุง WebAuthn สองประการ
เมื่อเราใช้เบราเซอร์เข้าเว็บและล็อกอินบริการที่รองรับ WebAuthn เบราว์เซอร์ที่รองรับ Passkey จะให้เลือกว่าต้องการยืนยันตัวตนด้วยกุญแจ USB หรือใช้โทรศัพท์ หากเราเลือกใช้โทรศัพท์ เบราว์เซอร์จะแสดง QR ขึ้นมา และเมื่อใช้โทรศัพท์สแกน QR แล้ว โทรศัพท์และเบราว์เซอร์จะส่งข้อมูลผ่าน Bluetooth เพื่อยืนยันว่าอุปกรณ์ทั้งสองอยู่ใกล้ๆ กัน ไม่สามารถสแกน QR จากระยะไกลเพื่อล็อกอินได้ จากนั้นทั้งโทรศัพท์และเบราว์เซอร์จะเชื่อมต่อเข้าหา proxy ผ่านอินเทอร์เน็ตเปิด tunnel เชื่อมต่อถึงกันโดยตรง (ไม่สามารถส่งข้อมูลโดยตรงผ่าน Bluetooth ได้เพราะการเชื่อมต่อ Bluetooth นั้นซับซ้อนและหลายครั้งไม่เสถียร)
เมื่อเชื่อมต่อได้แล้ว เบราว์เซอร์จะทำงานเหมือนมีกุญแจ USB อยู่ในเครื่องโดยตรง เบราว์เซอร์จะส่งข้อมูลโดเมนที่กำลังใช้งานอยู่ ส่งข้อมูลยืนยันตัวตนจากเซิร์ฟเวอร์บริการ กลับไปยังโทรศัพท์ และส่งข้อมูลล็อกอินจากโทรศัพท์กลับไปยังเซิร์ฟเวอร์แบบเดียวกับการล็อกอินด้วยกุญแจปกติ
ความซับซ้อนทั้งหมดนี้ถูกซ่อนออกจากผู้ใช้ทั่วไป เราแค่มีอุปกรณ์ที่รองรับ Passkey และสามารถล็อกอินได้บนทุกอุปกรณ์ที่ซิงก์กุญแจข้ามไปได้ ผู้ใช้ที่มี iPhone จะล็อกอินได้ทันทีบน iPhone, iPad, หรือ macOS ขณะที่ยังสามารถล็อกอินทุกบริการข้ามแพลตฟอร์มได้ด้วย
สำหรับองค์กรที่ไม่ไว้ใจการซิงก์กุญแจข้ามอุปกรณ์เช่นนี้ ยังสามารถเลือกกำหนดกุญแจแบบล็อกเข้ากับอุปกรณ์โดยตรงได้ แต่กับบัญชีโดยทั่วๆ ไปการใช้กุญแจแบบซิงก์ได้ก็ให้ความปลอดภัยที่ดีกว่าการปล่อยให้ผู้ใช้ตั้งรหัสผ่านอย่างมากแล้ว และยังลดความเสี่ยงของการ phishing ลงไปได้ เมื่อซอฟต์แวร์ทั้งหมดรองรับ Passkey จึงน่าจะทำให้ความปลอดภัยรวมของผู้ใช้ดีขึ้นพร้อมกับทำให้ผู้ใช้สามารถใช้งานได้สะดวกขึ้นไปด้วย การที่ผู้ผลิตเบราว์เซอร์รายใหญ่ล้วนให้คำมั่นว่าจะรองรับ Passkey รวมถึงแพลตฟอร์มโทรศัพท์มือถือรายหลักทั้ง iOS และ Android ก็ประกาศรองรับจึงน่าจะทำให้ Passkey กลายเป็นอนาคตของการล็อกอินที่ปลอดภัยยิ่งขึ้น
Comments
แนวการเขียนของคุณ lew เหมือนหนังสือบทความไอทีเมื่อ 20 ปีก่อน ซึ่งเกือบ ๆ จะเป็นหนังสือ text อยู่แล้ว
สำหรับผมที่อ่านผ่าน ๆ มักจะไม่ค่อยเข้าใจในทันที ถ้าเรื่องไหนน่าสนใจก็ต้องอ่านซ้ำหลาย ๆ รอบถึงจะเริ่มเข้าใจได้ ส่วนหนึ่งเป็นเพราะเรื่องที่เขียนด้วย ที่มีความซับซ้อนในตัวมันเองระดับหนึ่งอยู่แล้ว
เอามาจากอันนี้(ย่อหน้าที่ 2 จากท้ายของหัวข้อเกร็ดเล็กเกร็ดน้อย)
ส่วนตัวผมคิดว่าหลังๆ คุณ lew เขียนดีมากๆ แต่อ่านในฐานะ experienced software developer นะ (เหมิือนตบหัวแล้วลูบหลัง)
ผมอ่านรอบแรกก็ยอมรับว่าค่อนข้างงงเหมือนกันครับ คิดว่าอาจจะเจาะจง target ผู้อ่านที่ค่อนข้างเป็น technical สักหน่อยละมั้ง
ถ้าเจตนาจะเผยแพร่เป็นการทั่วไปคงจะต้อง rewrite เป็นหมวดหมู่หรือมี metaphor อีกสักหน่อยน่าจะเข้าใจเป็นการดีเลย
บล็อกส่วนตัวที่อัพเดตตามอารมณ์และความขยัน :P
แอบเหนื่อยเหมือนกันนะเนี่ยถ้าจะทำจริงๆ ยิ่งต้องมาทำ proxy ให้ tunnel ตัว challenge ด้วยเนี่ย (ไม่รู้จะมี lib/tools ให้ใช้แบบตอนเรา endorse JWT รึเปล่านะ คิดว่าเดี๋ยวคงมี)
ยังไม่นับที่ตัว PC จะต้องรองรับ Bluetooth อีก (ผมไม่แน่ใจว่า desktop มีเป็นการทั่วไปแล้วหรือยังนะ ไม่ได้ใช้เครื่องใหม่ๆ มานานแล้วด้วย) แต่ก็เห็นด้วยว่าในท้ายที่สุดมันก็คงต้องมาทางนี้แหละ
บล็อกส่วนตัวที่อัพเดตตามอารมณ์และความขยัน :P
เท่าที่ลองอ่านวิธีการ implement จาก https://passkeys.dev/ เหมือนว่าเราจะไม่ต้องทำ proxy เองนะครับ แค่เรียก
navigator.credentials.get
ใน browser แล้วรอมัน resolve อย่างเดียวก็จะได้ response ที่เอาไปเช็คกับ server ของเราได้เลยโดยไม่ต้องสนใจว่าจะมาจาก key บนเครื่องนั้นหรือมาจากเครื่องอื่นผ่าน proxy มามีอยู่แล้วครับ openssl หรือ libsodium
ปกติผมเห็นก็ใช้กันอยู่เท่านี้เสียส่วนใหญ่ (library อื่นก็ wrap 2 อันนี้อีกที)
คนทำ proxy เป็นผู้ผลิตเบราว์เซอร์ครับ ตัวโทรศัพท์เราเชื่อมต่อกับเบราว์เซอร์อยู่แล้ว
คนทำเว็บไม่ต้องสนใจว่าเป็นกุญแจต่อกับเครื่องโดยตรง หรือต่อผ่านอินเทอร์เน็ตซับซ้อนแค่ไหน
lewcpe.com, @wasonliw
ก็ดีนะ สะดวกดี ไม่ต้องจำรหัสผ่านให้ยุ่งยาก บ้างครั้งตั้งยาวมาก ลืมไปก็มี
แล้วถ้าโทรศัพท์หายทำอย่างไรครับ ? หรือว่าเราก็ backup passkey ไปกับ account ของโทรศัพท์อีกที เช่น iCloud, Google
That is the way things are.
มีทั้งแบบที่ sync ได้กับ iCloud, Google, 1Password (ในอนาคต) แล้วก็มีแบบที่ผูกกับ hardware เอาออกมาไม่ได้หายแล้วหายเลยเช่น YubiKey ครับ Website สามารถเลือกได้ว่าจะบังคับให้ใช้แบบที่ผูกกับ hardware มั้ยหรือแบบ sync ได้ก็พอ
1Password ใช้ได้แล้วครับ (ผมใช้กับ ebay อยู่)
โดยทั่วไปแล้วเว็บรองรับกุญแจแทบไม่จำกัดครับ อย่าง Google Account นี่จะปิด SMS ได้ต้องใส่กุญแจอย่างน้อยสองอัน
แต่ใช่ครับ Passkey วิ่งไปกับ iCloud/Google Account ได้ ล็อกอินโทรศัพท์ใหม่ก็ได้ Passkey มาเลย
lewcpe.com, @wasonliw
ขอบคุณทุกท่านที่มาช่วยตอบครับ
That is the way things are.
มันมีตั้งนานแล้วไม่ใช้หรอครับAppleก็ใช้มาตลอด
คำว่านานนี่แต่ละคนก็ไม่เท่ากันเท่าไหร่นะครับ 😅
ยังไม่ถึงปีนี่บางคนก็ว่านานแล้วเพราะก็ใช้จนชินแล้ว บางคนก็ เอ้า ก็เพิ่งมานี่นา