ปัญหา
ฟิชชิงเป็นปัญหาด้านความปลอดภัยอันดับต้นๆ บนเว็บ กล่าวคือ 81% ของการละเมิดบัญชีที่เกี่ยวข้องกับการแฮ็กในปีที่แล้วมีการใช้รหัสผ่านที่ไม่รัดกุมหรือถูกขโมย การตอบสนองของอุตสาหกรรมต่อปัญหานี้คือการตรวจสอบสิทธิ์แบบหลายปัจจัย แต่การติดตั้งใช้งานจะกระจัดกระจายและส่วนใหญ่ยังไม่สามารถจัดการกับฟิชชิงได้อย่างเพียงพอ เราร่วมงานกับ FIDO Alliance มาตั้งแต่ปี 2013 และเมื่อเร็วๆ นี้ โดย W3C ได้นำโปรโตคอลป้องกันการฟิชชิงที่ได้มาตรฐานมาปรับใช้กับเว็บแอปพลิเคชันต่างๆ
WebAuthn คืออะไร
Web Authentication API มอบสิทธิ์เข้าถึง Authenticator ที่ใช้สื่อกลาง User Agent สำหรับแอปพลิเคชันเว็บซึ่งมักเป็นโทเค็นฮาร์ดแวร์ที่เข้าถึงได้ผ่าน USB/BLE/NFC หรือโมดูลที่สร้างในแพลตฟอร์มโดยตรง เพื่อจุดประสงค์ในการสร้างและท้าทายข้อมูลเข้าสู่ระบบคีย์สาธารณะที่กำหนดขอบเขตระดับแอปพลิเคชัน (eTLD+k) ทำให้มีกรณีการใช้งานที่หลากหลาย เช่น
- 2FA มีการรบกวนต่ำและป้องกันฟิชชิง (ใช้ร่วมกับรหัสผ่าน)
- การให้สิทธิ์ซ้ำโดยใช้ข้อมูลไบโอเมตริกแบบไม่ใช้รหัสผ่าน
- 2FA ต่างๆ มีความติดขัดต่ำและป้องกันฟิชชิงโดยที่ไม่ต้องใช้รหัสผ่าน (ใช้กับบัญชีที่ไม่ต้องใช้รหัสผ่าน)
เบราว์เซอร์หลักๆ ส่วนใหญ่จะใช้ API นี้ โดยมีจุดมุ่งหมายเพื่อลดความซับซ้อนของ UI ที่พบเมื่อต้องพิสูจน์ตัวตนทางออนไลน์และลดฟิชชิงลงได้อย่างมาก
WebAuthn ขยาย API การจัดการข้อมูลเข้าสู่ระบบและเพิ่มประเภทข้อมูลเข้าสู่ระบบใหม่ชื่อ PublicKeyCredential
WebAuthn จะตัดการสื่อสารระหว่างเบราว์เซอร์กับ Authenticator และช่วยให้ผู้ใช้ทำสิ่งต่อไปนี้
- สร้างและลงทะเบียนข้อมูลเข้าสู่ระบบคีย์สาธารณะสำหรับเว็บไซต์
- ตรวจสอบสิทธิ์ของเว็บไซต์ด้วยการพิสูจน์การครอบครองคีย์ส่วนตัวที่เกี่ยวข้อง
Authenticator เป็นอุปกรณ์ที่สร้างคู่คีย์ส่วนตัว/สาธารณะและรวบรวมความยินยอมได้ คุณให้ความยินยอมในการลงนามได้ด้วยการแตะเพียงครั้งเดียว การอ่านลายนิ้วมือที่สำเร็จ หรือด้วยวิธีการอื่นๆ ตราบเท่าที่เป็นไปตามข้อกำหนดของ FIDO2 (มีโปรแกรมการรับรองสำหรับผู้ตรวจสอบสิทธิ์จาก FIDO Alliance) Authenticator สร้างไว้ในแพลตฟอร์ม (เช่น ตัวสแกนลายนิ้วมือบนสมาร์ทโฟน) หรือเชื่อมต่อผ่าน USB, บลูทูธพลังงานต่ำ (BLE) หรือ Near Field Communication (NFC) ได้
วิธีการทำงาน
การสร้างคู่คีย์และการลงทะเบียนผู้ใช้
เมื่อผู้ใช้ต้องการลงทะเบียนข้อมูลเข้าสู่ระบบในเว็บไซต์ (ซึ่ง WebAuthn เรียกกันว่า "ฝ่ายที่เกี่ยวข้อง") ให้ทำดังนี้
- ฝ่ายที่เชื่อมั่นว่าจะต้องเผชิญกับความท้าทาย
- ผู้ให้บริการที่ต้องพึ่งพาเบราว์เซอร์จะต้องสร้างข้อมูลเข้าสู่ระบบใหม่สำหรับฝ่ายที่ต้องพึ่งพาเบราว์เซอร์ผ่านทาง API การจัดการข้อมูลเข้าสู่ระบบ เช่น ระบุความสามารถของอุปกรณ์ เช่น อุปกรณ์มีการตรวจสอบสิทธิ์ผู้ใช้ของตนเองหรือไม่ (ด้วยข้อมูลไบโอเมตริก ฯลฯ)
- หลังจากที่ Authenticator ได้รับความยินยอมจากผู้ใช้แล้ว Authenticator จะสร้างคู่คีย์และส่งกลับคีย์สาธารณะและเอกสารรับรองที่ลงนามแล้ว (ไม่บังคับ) ไปยังเว็บไซต์
- เว็บแอปจะส่งต่อคีย์สาธารณะไปยังเซิร์ฟเวอร์
- เซิร์ฟเวอร์จะจัดเก็บคีย์สาธารณะซึ่งเชื่อมโยงกับข้อมูลประจำตัวของผู้ใช้ เพื่อจดจำข้อมูลเข้าสู่ระบบสำหรับการตรวจสอบสิทธิ์ในอนาคต
let credential = await navigator.credentials.create({ publicKey: {
challenge: new Uint8Array([117, 61, 252, 231, 191, 241, ...]),
rp: { id: "acme.com", name: "ACME Corporation" },
user: {
id: new Uint8Array([79, 252, 83, 72, 214, 7, 89, 26]),
name: "jamiedoe",
displayName: "Jamie Doe"
},
pubKeyCredParams: [ {type: "public-key", alg: -7} ]
}});
การตรวจสอบสิทธิ์ผู้ใช้
เมื่อเว็บไซต์ต้องการหลักฐานว่ากำลังโต้ตอบกับผู้ใช้ที่ถูกต้อง จะเป็นดังนี้
- ฝ่ายที่ไว้ใจจะตั้งคำถามและจัดเตรียมรายการข้อมูลเข้าสู่ระบบที่ลงทะเบียนไว้กับผู้ใช้ให้กับเบราว์เซอร์ เครื่องมือนี้ยังบอกตำแหน่งที่จะหาเอกสารรับรองได้ด้วย เช่น ใน Authenticator ในเครื่อง หรือในอุปกรณ์ภายนอกผ่าน USB, BLE เป็นต้น
- เบราว์เซอร์ขอให้ Authenticator ลงนามในคำท้า
- หาก Authenticator มีข้อมูลเข้าสู่ระบบที่ระบุมาให้ Authenticator จะแสดงการยืนยันที่ลงนามไปยังเว็บแอปหลังจากได้รับความยินยอมจากผู้ใช้
- โดยเว็บแอปจะส่งต่อการยืนยันที่ลงนามไปยังเซิร์ฟเวอร์ให้บุคคลที่ไว้วางใจเพื่อยืนยัน
- เมื่อยืนยันโดยเซิร์ฟเวอร์แล้ว ขั้นตอนการตรวจสอบสิทธิ์จะถือว่าสำเร็จ
let credential = await navigator.credentials.get({ publicKey: {
challenge: new Uint8Array([139, 66, 181, 87, 7, 203, ...]),
rpId: "acme.com",
allowCredentials: [{
type: "public-key",
id: new Uint8Array([64, 66, 25, 78, 168, 226, 174, ...])
}],
userVerification: "required",
}});
ลองใช้ WebAuthn ด้วยตนเองที่ https://webauthndemo.appspot.com/
สิ่งที่จะเกิดขึ้นต่อไป
Chrome 67 รุ่นเบต้ามาพร้อมกับการรองรับ navigator.credentials.get({publicKey: ...})
และ navigator.credentials.create({publicKey:... })
รวมถึงช่วยให้ใช้ Authenticator ของ U2F/CTAP 1 ผ่านการส่งผ่าน USB บนเดสก์ท็อปได้
รุ่นที่กำลังจะเปิดตัวจะเพิ่มการรองรับการขนส่งเพิ่มเติม เช่น BLE และ NFC รวมถึงโปรโตคอลสาย CTAP 2 ที่ใหม่กว่า นอกจากนี้ เรายังพยายามดำเนินการขั้นตอนขั้นสูงขึ้นที่เปิดใช้โดย CTAP 2 และ WebAuthn เช่น การตรวจสอบสิทธิ์ที่ป้องกันด้วย PIN, การเลือกบัญชีในท้องถิ่น (แทนการพิมพ์ชื่อผู้ใช้หรือรหัสผ่าน) และการลงทะเบียนลายนิ้วมือ
โปรดทราบว่า Microsoft Edge รองรับ API นี้ด้วย และ Firefox รองรับ WebAuthn ใน Firefox 60 ด้วย
แหล่งข้อมูล
เรากำลังดำเนินการเกี่ยวกับเอกสารที่มีรายละเอียดเพิ่มเติมดังต่อไปนี้
- การติดตั้งใช้งาน WebAuthnDemo แบบอาศัยตัวอย่าง
- บทความการวิเคราะห์ WebAuthn โดย Adam Langley
เซสชัน "มีอะไรใหม่ในการลงชื่อสมัครใช้และลงชื่อเข้าใช้บนเว็บ" ที่ WebAuthn ใน Google I/O 2018 ครอบคลุม