10 July 2019

[Android Dev Tips] รู้จักกับ Biometric Authentication บนแอนดรอยด์




        ในทุกวันนี้อุปกรณ์แอนดรอยด์ส่วนใหญ่ในท้องตลาดนั้นจะมี Biometric Sensor อยู่เสมอ โดยที่รู้จักกันเยอะที่สุดก็คือ Fingerprint Scanner นั่นเอง นอกจากจะช่วยให้ผู้ใช้สามารถใช้งานเครื่องได้อย่างปลอดภัยและรวดเร็วแล้ว ก็ยังมี API ให้นักพัฒนาได้ใช้งานกันอีกด้วย

        ซึ่งบทความนี้จะไม่ได้มาพูดถึงเรื่องการเขียนโค้ดแต่อย่างใด เพราะจะมาเล่าให้ฟังเพื่อให้ผู้ที่หลงเข้ามาอ่านได้รู้จักกับเจ้า Biometric Authentication บนแอนดรอยด์กันว่ามันคืออะไร มันเป็นยังไง และทำไมนักพัฒนาแอนดรอยด์ควรจะรู้จักกับเจ้าสิ่งนี้

การยืนยันตัวตนด้วยข้อมูลทางชีวภาพ

        Biometric Authentication หรือ Biometric Scanner ก็คือวิธีการยืนยันตัวตนผู้ใช้เครื่องว่าเป็นเจ้าของเครื่องจริงๆ โดยใช้ข้อมูลทางชีวภาพ หรือก็คือข้อมูลจากร่างกายที่สามารถระบุได้ว่าเป็นคนนั้นจริงๆ ไม่ใช่คนอื่นที่แอบเนียนมาใช้เครื่องหรือแอบมาขโมยข้อมูล


        ดังนั้นหน้าที่ของ Biometric Authentication ก็คือการตรวจสอบตัวตนของผู้ใช้อุปกรณ์แอนดรอยด์ ณ ตอนนั้นว่าเป็นเจ้าของเครื่อง (ที่เคยลงทะเบียนไว้ในเครื่อง) หรือไม่ ก่อนที่จะเข้าถึงข้อมูลส่วนตัวได้

        ซึ่งประโยชน์ของ Biometric Authentication ที่เห็นได้ชัดเจนและใช้บ่อยที่สุดในแอนดรอยด์ก็คือการปลดล็อคหน้าจอเครื่องนั่นเอง


        และด้วยการที่มันสามารถเรียกใช้งานผ่าน API ของแอนดรอยด์ได้ จึงทำให้แอปที่ต้องการความปลอดภัยสูง เช่น แอปของธนาคาร หรือแอปที่มีข้อมูลสำคัญๆ จึงเลือกที่จะใช้ Biometric Authentication ด้วย เพื่อเพิ่มความสะดวกสบายให้กับผู้ใช้งาน

ทำไมต้องใช้วิธีนี้? มันดีกว่าวิธีอื่นหรอ?

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

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

ภาพจาก https://www.digitaltrends.com/mobile/samsung-galaxy-s10-fingerprint-sensor-improvements-news/

        ในขณะที่รหัสผ่านหรือโค้ดตัวเลขนั้นจะสามารถบอกต่อกันได้ ถ้าเผลอบอกใครไปก็แปลว่าคนอื่นก็สามารถยืนยันตัวตนแทนเราได้ทันที

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

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

         ดังนั้นความแม่นยำ ความปลอดภัย และความรวดเร็วจึงเป็นหัวใจสำคัญที่ทำให้ Biometric Authentication กลายเป็นส่วนหนึ่งที่ทำให้อุปกรณ์แอนดรอยด์ในยุคนี้ต้องมีติดเครื่องไปซะแล้ว

Biometric Authentication บนแอนดรอยด์มีวิธีไหนบ้าง

         อุปกรณ์แอนดรอยด์ในปัจจุบันนี้มักจะใส่ Biometric Sensor เข้ามาแทบจะทุกรุ่นแล้ว โดยที่นิยมและเป็นพื้นฐานที่สุดก็คือ Fingerprint Scanner นั่นเอง

         โดยปัจจุบันนี้จะมีอยู่ทั้งหมด 3 วิธีด้วยกัน

         • ลายนิ้วมือ
         • ม่านตา
         • ใบหน้าแบบ 3 มิติ

         ซึ่งบางวิธีนั้นจะมีเฉพาะบนอุปกรณ์แอนดรอยด์บางยี่ห้อเท่านั้น เนื่องจากเป็นเทคนิคที่ถูกพัฒนาของผู้ผลิตมือถือยี่ห้อนั้นๆ และกลายเป็นสิทธิบัตรของยี่ห้อนั้น ยกตัวอย่างเช่น Iris Scanner ที่ Samsung ถือสิทธิบัตรอยู่ จึงทำให้ยี่ห้ออื่นๆเลียนแบบได้ยาก เว้นแต่ว่าจะใช้เทคนิคที่แตกต่างกัน แต่สามารถใช้ม่านตาในการยืนยันตัวตนได้เหมือนกัน

การใช้เสียงและใบหน้าด้วยกล้องถ่ายภาพทั่วไปเพื่อปลดล็อคเครื่อง ไม่ใช่ Biometric Authentication

        เนื่องจากทั้ง 2 วิธีนั้นสามารถลอกเลียนแบบได้ ดังนั้น Biomentic Authentication บนแอนดรอยด์จึงไม่มีการใช้เสียงหรือใช้กล้องถ่ายภาพทั่วไปในการยืนยันตัวตน

         วิธีที่ทำให้เข้าใจผิดมากที่สุดนั่นคือการใช้กล้องบนตัวเครื่องแอนดรอยด์ในการยืนยันตัวตนที่ใช้หลักการของภาพแบบ 2 มิติ


         เนื่องจากวิธีดังกล่าวใช้วิธีการเปรียบเทียบภาพจากกล้องกับข้อมูลใบหน้าที่มีอยู่ แต่สิ่งที่เกิดขึ้นนั้นคือการทำ Image Processing ที่อยู่บนภาพ 2 มิติเท่านั้น จึงทำให้การใช้ภาพถ่ายหรือวีดีโอของคนๆนั้นแทนได้


         ถึงแม้ว่าแอนดรอยด์จะสามารถใช้กล้องถ่ายภาพใบหน้าเพื่อปลดล็อคหน้าจอได้ แต่ก็อยู่ในกลุ่มเดียวกับการปลดล็อคหน้าจอด้วย PIN, Password หรือ Pattern ที่สามารถถูกปลอมแปลงได้ ซึ่งบนระบบแอนดรอยด์ก็ได้มีการระบุไว้ชัดเจนว่า "Someone who looks like you could unlock your phone" ซึ่งคำอธิบายดังกล่าวจะแสดงอยู่ในขั้นตอนการเปิดใช้งาน Face Unlock

         ซึ่งแตกต่างจาก 3D Face Sensing ของ Vivo หรือ Face ID ของ Apple ที่ใช้กล้องเฉพาะทางที่อยู่บนเครื่องเพื่อวิเคราะห์ใบหน้าแบบ 3D ที่แต่ละคนจะมีข้อมูลใบหน้าแตกต่างกันจริงๆ และไม่สามารถใช้ภาพถ่ายหรือวีดีโอแทนได้เลย

ปลอดภัยแค่ไหนเชียว โดนแฮคได้หรือป่าว?

        เนื่องจาก Biometric Authentication จะทำการอ่านข้อมูลของผู้ใช้ในตอนแรกแล้วเก็บไว้ในเครื่อง ไม่ได้ส่งข้อมูลออกไปไว้ที่ไหน จึงมีคำถามเรื่อง Security ตามมาเพราะว่าระบบแอนดรอยด์นั้นขึ้นชื่อในเรื่อง "แค่รูทเครื่องก็ทำอะไรได้หมดแหละ" อยู่แล้ว

        แบบนี้ข้อมูลทางชีวภาพ ไม่ว่าจะเป็นลายนิ้วมือหรือม่านตาจะปลอดภัยได้ยังไง ในเมื่อรูทเครื่องก็เข้าถึงทุกอย่างในระบบแอนดรอยด์ได้แล้ว?

        ใช่ครับ ระบบแอนดรอยด์ถ้าถูกรูทก็จบ สามารถเข้าถึงได้ทุกที่เพราะมันเป็น Root Access แต่ถ้าเจ้าของบล็อกบอกว่า

        "ข้อมูลทางชีวภาพไม่ได้เก็บไว้ใน Android OS เลยล่ะ?" 

         ถึงจุดนี้ขอแนะนำให้รู้จักกับสิ่งที่เรียกว่า

Trusty TEE

        Trusty เป็น Secure OS ที่เน้นจัดการในเรื่องความปลอดภัย ที่ทำงานอยู่ในเครื่องเหมือนกับ Android OS แต่ว่าแยกตัวออกมาจากระบบแอนดรอยด์อย่างอิสระ จึงทำให้การรูทเครื่องในฝั่งแอนดรอยด์ไม่ส่งผลกับ Trusty เพราะว่าเป็น OS คนละตัวกันนั่นเอง

         โดยหน้าที่ของ Trusty คอยช่วยเหลือในเรื่องของการทำงานที่ต้องการความปลอดภัยสูงที่มีชื่อเรียกว่า Trusted Execution Environment (TEE) ให้กับระบบแอนดรอยด์อีกทีหนึ่ง เพื่อป้องกันแอปที่ประสงค์ร้ายหรือช่องโหว่ด้านความปลอดภัยของแอนดรอยด์อีกทีหนึ่ง


         และข้อมูลทางชีวภาพของผู้ใช้ก็จะถูกเก็บไว้ใน Trusty นั่นเอง โดยที่ระบบแอนดรอยด์จะไม่สามารถเข้าถึงข้อมูลดังกล่าวได้ เพราะว่า Trusty เป็นคนจัดการเองแทบทั้งหมด และนอกจากนี้ CPU ที่ใช้ในระบบแอนดรอยด์ก็มีความสามารถดังกล่าวเพื่อให้ Trusty ทำงานอยู่บนนั้นโดยเฉพาะด้วย เช่น ARM ที่จะมีเทคโนโลยีที่ชื่อว่า ARM Trustzone ที่จะแยกการประมวลผลหลักกับ TEE ออกจากกัน

        จริงๆแล้วการเก็บข้อมูลทางชีวภาพเป็นแค่งานส่วนหนึ่งของ Trusty เท่านั้น เพราะจริงๆแล้ว Trusty ยังถูกใช้เก็บข้อมูล DRM ที่ใช้ในการถอดรหัสข้อมูลจำพวกหนังภาพยนต์ที่ดูผ่านแอพด้วย (จึงเป็นที่มาว่าทำไม Online Streaming อย่าง Netflix ถึงมั่นใจได้ว่าหนังที่อยู่ในแอปนั้นจะปลอดภัยจากการล้วงไฟล์หนังจากภายในเครื่อง)

        ดังนั้นหายห่วงเรื่องความปลอดภัยจากการเก็บข้อมูลทางชีวภาพได้เลย เพราะว่าทีมพัฒนาแอนดรอยด์เค้าได้คิดเผื่อกรณีนี้ไว้เรียบร้อยแล้ว

จะรู้ได้ยังไงว่าต้องใช้ Biometric Authentication แบบไหน?

        จริงๆแล้วนักพัฒนาไม่สามารถกำหนดได้เลยว่าต้องการจะใช้ Biometric Authentication แบบไหน เพราะทั้งหมดนี้จะถูกรวมอยู่ในขั้นตอนเดียวกันเลย นั่นหมายความว่าถ้าเป็นเครื่อง Samsung ที่มีทั้ง Fingerprint Scanner และ Iris Scanner ผู้ใช้จะสามารถยืนยันตัวตนแบบไหนก็ได้ขึ้นอยู่กับความสะดวก ในขณะที่นักพัฒนาสนใจแค่ว่ามันคือ Biometric Authentication เท่านั้น

        และอุปกรณ์แอนดรอยด์ทุกเครื่องที่มี Biometric Sensor ก็จะมี Fingerprint Scanner อยู่เสมอ จึงไม่ต้องกังวลไปว่าแอปของผู้ที่หลงเข้ามาอ่านจะต้องมานั่งเช็คว่าเครื่องมี Biomentric Sensor แบบไหนบ้าง เพื่อแสดงภาพประกอบหรือข้อความแจ้งเตือนอยู่ใช้ แต่ให้เหมารวมไปเลยว่าทุกเครื่องจะมี Fingerprint Scanner ด้วย

        เพราะการเปิดใช้งาน Biometric Authentication แบบอื่นๆที่ไม่ใช่ Fingerprint Scanner จะมีการบังคับผู้ใช้เสมอว่าจะต้องตั้งค่าให้กับ Fingerprint Scanner ก่อนถึงจะกำหนดวิธีอื่นๆได้ ดังนั้นไม่ว่าจะเป็นการสแกนใบหน้าหรือม่านตา ก็สามารถใช้การแสกนลายนิ้วมือแทนได้เสมอ

การเรียกใช้งาน Biometric Authentication

        เนื่องจากบทความนี้ไม่ได้ตั้งใจอธิบายเกี่ยวกับโค้ด ดังนั้นจึงขอพูดคร่าวๆว่า การเขียน Biometric Authentiaction ไว้ในแอปให้ใช้ Biometric API ของ AndroidX เพื่อให้รองรับทั้ง Fingerprint API ในเวอร์ชันเก่าและ Biomentric API ที่มาใน Android 9.0 Pie ขึ้นไป จะได้ไม่ต้องเขียนโค้ดแยกเวอร์ชันให้วุ่นวาย

implementation 'androidx.biometric:biometric:1.0.0-alpha04'

        โดยการเรียกใช้งาน Biomentric API จะไม่สามารถรู้ได้ว่าผู้ใช้เป็นใคร รู้แค่ว่ายืนยันตัวตนผ่านหรือไม่ผ่านเท่านั้น ทั้งนี้ก็เพื่อความปลอดภัยของผู้ใช้ที่สำคัญกว่าแอปของนักพัฒนาอย่างเรา และข้อมูลทางชีวภาพจะอยู่ในเครื่องนั้นๆเสมอ ไม่สามารถย้ายไปไหนได้ ดังนั้นการทำ Biometric Authentication จึงเป็นการยืนยันตัวตนแค่เครื่องนั้นๆเท่านั้น

         ยกเว้นของ Samsung ที่จะมี Solution สำหรับ Partner กับทาง Samsung (ถ้าจำไม่ผิด) โดยจะเก็บข้อมูลทางชีวภาพผ่านระบบของ Samsung ที่สามารถใช้อุปกรณ์แอนดรอยด์เครื่องอื่นๆของ Samsung เพื่อยืนยันตัวตนแล้วรู้ได้ว่าคนๆนั้นคือใคร ถึงแม้ว่าจะไม่ใช่เจ้าของเครื่องนั้นก็ตาม

         และที่ลืมไปไม่ได้ ก็คืออย่าลืมเช็คก่อนนะว่าอุปกรณ์แอนดรอยด์นั้นๆรองรับ Biometric Authentication หรือป่าว ถ้าไม่รองรับก็ไม่ต้องไปเสียเวลาเรียกคำสั่งของ Biometric API หรอก

ควรมีทางเลือกสำรองไว้ด้วยเสมอ

        ในการเรียกใช้งาน Biometric Authentication จะมีจุดประสงค์หลักคือการเข้าใช้งานแอปแทนการล็อกอินด้วย Username และ Password เพื่อให้สะดวกและรวดเร็วขึ้น แต่การยืนยันตัวตนก็ไม่ควรผูกขาดไว้ที่ Biometric Authentication เท่านั้น

         ควรมีวิธีสำรองเผื่อไว้ด้วย เช่น สามารถใช้ PIN แทนได้ โดยที่วิธีสำรองที่ว่านั้นไม่ควรใช้ตัวเดียวกับที่ใช้ปลดล็อคหน้าจอ เพราะว่าการทำเช่นนั้นจะไม่มีประโยชน์อะไรทันที เมื่อมีคนอื่นที่สามารถปลดล็อคเครื่องได้ ก็สามารถเข้าใช้งานแอปนั้นๆได้เช่นกัน

        ดังนั้นทางที่ดีจึงควรทำวิธีสำรองไว้ใช้งานแค่ในแอปเท่านั้น เพื่อให้ผู้ใช้สามารถกำหนดรหัสแยกออกจากรหัสที่ใช้ในการปลดล็อคหน้าจอ


         ส่วนเรื่อง Wording ที่จะใช้ในแอปก็สามารถใช้เป็นคำว่า Fingerprint Scanner หรือสแกนลายนิ้วมือได้เลย เพราะอย่างที่บอกไปในตอนแรกว่าทุกเครื่องที่มี Biometric Authentication จะมี Fingerprint Scanner อยู่เสมอ ซึ่งผู้ใช้ส่วนใหญ่จะเข้าใจอยู่แล้ว

         ถ้าอยากแสดงให้ผู้ใช้รู้ว่ามีอะไรบ้างก็ได้นะ แต่การเขียนมานั่งเขียนเพื่อเช็คว่าอุปกรณ์แอนดรอยด์แต่ละรุ่นมี Biometric Authentication แบบไหนบ้าง ก็คงไม่คุ้มแรงซักเท่าไร

สรุป

        ถือว่าเป็นเรื่องดีที่ในยุคนี้อุปกรณ์แอนดรอยด์ส่วนใหญ่รองรับ Biometric Authentication กันแล้ว การทำให้แอปรองรับจึงเป็นเรื่องที่จำเป็นสำหรับแอปที่มีความปลอดภัย และถึงแม้ว่าจะมี Biometric Authentication ให้ใช้งานก็จริง แต่เพื่อความปลอดภัยของผู้ใช้ จึงทำให้แอปนั้นสามารถเรียกใช้งานได้แค่อย่างผิวเผินเท่านั้น (ก็น่าจะเพียงพอแล้วล่ะ)

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