หากต้องการปกป้องระบบการตรวจสอบสิทธิ์ใน Android ให้พิจารณาเลิกใช้โมเดลที่อิงตามรหัสผ่าน โดยเฉพาะสำหรับบัญชีที่มีความละเอียดอ่อน เช่น บัญชีธนาคารและบัญชีอีเมลของผู้ใช้ โปรดทราบว่าแอปบางแอปที่ผู้ใช้ติดตั้งอาจมีเจตนาไม่ดีและอาจพยายามฟิชชิงผู้ใช้
นอกจากนี้ อย่าคิดว่าจะมีเพียงผู้ใช้ที่ได้รับอนุญาตเท่านั้นที่จะใช้อุปกรณ์ การขโมยโทรศัพท์ เป็นปัญหาที่พบได้ทั่วไป และผู้โจมตีมุ่งเป้าไปที่อุปกรณ์ที่ไม่ได้ล็อกเพื่อทำกำไรโดยตรง จากข้อมูลผู้ใช้หรือแอปทางการเงิน เราขอแนะนำให้แอปที่มีความละเอียดอ่อนทั้งหมดใช้ การหมดเวลาการตรวจสอบสิทธิ์ที่สมเหตุสมผล (15 นาที?) พร้อมการยืนยันด้วยข้อมูลไบโอเมตริก และ กำหนดให้มีการตรวจสอบสิทธิ์เพิ่มเติมก่อนดำเนินการที่มีความละเอียดอ่อน เช่น การโอนเงิน
กล่องโต้ตอบการตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริก
ไลบรารี Biometrics มีชุดฟังก์ชันเพื่อแสดงข้อความแจ้งที่ขอ การตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริก เช่น การจดจำใบหน้าหรือการจดจำลายนิ้วมือ อย่างไรก็ตาม คุณสามารถกำหนดค่าข้อความแจ้งไบโอเมตริกให้กลับไปใช้ LSKF ซึ่งมีความเสี่ยงที่ทราบกันดีว่าอาจถูกแอบดูรหัสผ่านได้ สำหรับแอปที่มีความละเอียดอ่อน เราขอแนะนำ ไม่ให้ใช้ PIN เป็นตัวเลือกสำรองสำหรับไบโอเมตริก และหลังจากลองใช้ไบโอเมตริกซ้ำจนหมดแล้ว ผู้ใช้จะรอหรือลงชื่อเข้าใช้อีกครั้งด้วยรหัสผ่านหรือรีเซ็ตบัญชีได้ การรีเซ็ตบัญชี ควรกำหนดให้ใช้ปัจจัยที่เข้าถึงได้ยากในอุปกรณ์ (แนวทางปฏิบัติแนะนำ ด้านล่าง)
วิธีนี้ช่วยลดการประพฤติมิชอบและการขโมยโทรศัพท์ได้อย่างไร
กรณีการใช้งานหนึ่งที่อาจช่วยป้องกันการประพฤติมิชอบได้คือการขอ การตรวจสอบสิทธิ์ไบโอเมตริกภายในแอปก่อนทำธุรกรรม เมื่อผู้ใช้ต้องการทำธุรกรรมทางการเงิน กล่องโต้ตอบไบโอเมตริกจะแสดงขึ้นเพื่อ ยืนยันว่าผู้ที่ทำธุรกรรมเป็นผู้ใช้ที่ตั้งใจทำธุรกรรมจริง แนวทางปฏิบัติแนะนำนี้จะช่วยป้องกันไม่ให้ผู้โจมตีขโมยอุปกรณ์ได้ไม่ว่าผู้โจมตีจะทราบหรือไม่ก็ตามว่ามี LSKF เนื่องจากผู้โจมตีจะต้องพิสูจน์ว่าตนเป็นเจ้าของอุปกรณ์
เพื่อเพิ่มระดับการรักษาความปลอดภัย เราขอแนะนำให้นักพัฒนาแอปขอการตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริกระดับ 3
และใช้ CryptoObject
สำหรับการทำธุรกรรมทางการเงินและ
การธนาคาร
การใช้งาน
- โปรดตรวจสอบว่าคุณได้รวมไลบรารี androidx.biometric
- รวมกล่องโต้ตอบการเข้าสู่ระบบด้วยไบโอเมตริกในกิจกรรมหรือ Fragment ที่มี ตรรกะที่คุณต้องการให้ผู้ใช้ได้รับการตรวจสอบสิทธิ์
Kotlin
private var executor: Executor? = null private var biometricPrompt: BiometricPrompt? = null private var promptInfo: BiometricPrompt.PromptInfo? = null fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) executor = ContextCompat.getMainExecutor(this) biometricPrompt = BiometricPrompt(this@MainActivity, executor, object : AuthenticationCallback() { fun onAuthenticationError( errorCode: Int, @NonNull errString: CharSequence ) { super.onAuthenticationError(errorCode, errString) Toast.makeText( getApplicationContext(), "Authentication error: $errString", Toast.LENGTH_SHORT ) .show() } fun onAuthenticationSucceeded( @NonNull result: BiometricPrompt.AuthenticationResult? ) { super.onAuthenticationSucceeded(result) Toast.makeText( getApplicationContext(), "Authentication succeeded!", Toast.LENGTH_SHORT ).show() } fun onAuthenticationFailed() { super.onAuthenticationFailed() Toast.makeText( getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT ) .show() } }) promptInfo = Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .build() // Prompt appears when user clicks "Log in". // Consider integrating with the keystore to unlock cryptographic operations, // if needed by your app. val biometricLoginButton: Button = findViewById(R.id.biometric_login) biometricLoginButton.setOnClickListener { view -> biometricPrompt.authenticate( promptInfo ) } }
Java
private Executor executor; private BiometricPrompt biometricPrompt; private BiometricPrompt.PromptInfo promptInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); executor = ContextCompat.getMainExecutor(this); biometricPrompt = new BiometricPrompt(MainActivity.this, executor, new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { super.onAuthenticationError(errorCode, errString); Toast.makeText(getApplicationContext(), "Authentication error: " + errString, Toast.LENGTH_SHORT) .show(); } @Override public void onAuthenticationSucceeded( @NonNull BiometricPrompt.AuthenticationResult result) { super.onAuthenticationSucceeded(result); Toast.makeText(getApplicationContext(), "Authentication succeeded!", Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); Toast.makeText(getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT) .show(); } }); promptInfo = new BiometricPrompt.PromptInfo.Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .build(); // Prompt appears when the user clicks "Log in". // Consider integrating with the keystore to unlock cryptographic operations, // if needed by your app. Button biometricLoginButton = findViewById(R.id.biometric_login); biometricLoginButton.setOnClickListener(view -> { biometricPrompt.authenticate(promptInfo); }); }
แนวทางปฏิบัติแนะนำ
เราขอแนะนำให้คุณเริ่มต้นด้วยโค้ดแล็บเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับไบโอเมตริก
คุณสามารถใช้กล่องโต้ตอบโดยมีหรือไม่มี การกระทําของผู้ใช้ที่ชัดเจนก็ได้ ทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน เราขอแนะนำให้คุณเพิ่มกล่องโต้ตอบไบโอเมตริก พร้อมการดำเนินการของผู้ใช้ที่ชัดเจนสำหรับทุกธุรกรรมเพื่อหลีกเลี่ยงการฉ้อโกง เราทราบดีว่า การเพิ่มการตรวจสอบสิทธิ์อาจทำให้ UX ไม่ราบรื่น แต่เนื่องจากลักษณะของ ข้อมูลที่จัดการในธุรกรรมของธนาคาร และการตรวจสอบสิทธิ์ ด้วยไบโอเมตริกนั้นราบรื่นกว่าวิธีการตรวจสอบสิทธิ์อื่นๆ เราจึงคิดว่า จำเป็นต้องเพิ่มระดับการนำทางนี้
ดูข้อมูลเพิ่มเติมเกี่ยวกับการตรวจสอบสิทธิ์ด้วยข้อมูลไบโอเมตริก
พาสคีย์
พาสคีย์ปลอดภัยกว่าและใช้งานง่ายกว่าเมื่อเทียบกับรหัสผ่าน พาสคีย์ใช้ การเข้ารหัสแบบกุญแจสาธารณะเพื่อให้ผู้ใช้ลงชื่อเข้าใช้แอปและเว็บไซต์ โดยใช้กลไกการล็อกหน้าจอของอุปกรณ์ เช่น ลายนิ้วมือหรือการจดจำ ใบหน้า ซึ่งจะช่วยให้ผู้ใช้ไม่ต้องจดจำและจัดการรหัสผ่าน และช่วยเพิ่มความปลอดภัยได้อย่างมาก
พาสคีย์สามารถตอบสนองข้อกำหนดการตรวจสอบสิทธิ์แบบหลายปัจจัยได้ในขั้นตอนเดียว โดยจะแทนที่ทั้งรหัสผ่านและรหัส OTP เพื่อให้การปกป้องที่แข็งแกร่งต่อ การโจมตีแบบฟิชชิง และหลีกเลี่ยงประสบการณ์การใช้งานที่เจ็บปวดของผู้ใช้จากรหัสผ่านแบบใช้ครั้งเดียวทาง SMS หรือแอป เนื่องจากพาสคีย์เป็นมาตรฐาน การติดตั้งใช้งานเพียงครั้งเดียวจึงช่วยให้ผู้ใช้ได้รับ ประสบการณ์การใช้งานแบบไม่มีรหัสผ่านในอุปกรณ์ เบราว์เซอร์ และ ระบบปฏิบัติการทั้งหมด
ใน Android ระบบรองรับพาสคีย์โดยใช้ไลบรารี Credential Manager Jetpack ซึ่งรวมวิธีการตรวจสอบสิทธิ์หลักๆ ไว้ด้วยกัน รวมถึงพาสคีย์ รหัสผ่าน และการลงชื่อเข้าใช้แบบรวม (เช่น ลงชื่อเข้าใช้ด้วย Google)
วิธีที่การดำเนินการนี้ช่วยลดการประพฤติมิชอบ
พาสคีย์จะปกป้องคุณจากการโจมตีแบบฟิชชิง เนื่องจากจะทำงานได้บนแอปและเว็บไซต์ที่ลงทะเบียนเท่านั้น
องค์ประกอบหลักของพาสคีย์คือคีย์ส่วนตัวแบบเข้ารหัส โดยปกติแล้ว คีย์ส่วนตัวนี้จะอยู่ในอุปกรณ์ของคุณเท่านั้น เช่น แล็ปท็อปหรือโทรศัพท์มือถือ และผู้ให้บริการข้อมูลเข้าสู่ระบบ (หรือที่เรียกว่าเครื่องมือจัดการรหัสผ่าน) เช่น เครื่องมือจัดการรหัสผ่านบน Google จะซิงค์คีย์ดังกล่าวในอุปกรณ์ต่างๆ บริการออนไลน์จะบันทึกเฉพาะคีย์สาธารณะที่เกี่ยวข้องเมื่อมีการสร้างพาสคีย์ ในระหว่างการเข้าสู่ระบบ บริการ จะใช้คีย์ส่วนตัวเพื่อลงนามในคำท้าจากคีย์สาธารณะ การดำเนินการนี้จะทำได้จากอุปกรณ์เครื่องใดเครื่องหนึ่งของคุณเท่านั้น นอกจากนี้ คุณต้องปลดล็อกอุปกรณ์หรือที่เก็บข้อมูลเข้าสู่ระบบเพื่อดำเนินการนี้ ซึ่งจะป้องกันการลงชื่อเข้าใช้ที่ไม่ได้รับอนุญาต (เช่น จากโทรศัพท์ที่ถูกขโมย)
หากต้องการป้องกันการเข้าถึงที่ไม่ได้รับอนุญาตในกรณีที่อุปกรณ์ถูกขโมยและปลดล็อกแล้ว ต้องจับคู่พาสคีย์กับระยะหมดเวลาการตรวจสอบสิทธิ์ที่เหมาะสม ผู้โจมตีที่ขโมยอุปกรณ์ไม่ควรใช้แอปพลิเคชันได้เพียงเพราะ ผู้ใช้ก่อนหน้านี้เข้าสู่ระบบไว้ แต่ข้อมูลเข้าสู่ระบบควร หมดอายุเป็นระยะๆ (เช่น ทุก 15 นาที) และผู้ใช้ควร ต้องยืนยันตัวตนผ่านการตรวจสอบสิทธิ์ซ้ำของล็อกหน้าจอ
หากโทรศัพท์ถูกขโมย พาสคีย์จะปกป้องคุณเนื่องจากขโมยไม่สามารถขโมยรหัสผ่านของคุณเพื่อใช้ในอุปกรณ์อื่นๆ ได้ เนื่องจากพาสคีย์จะใช้ได้เฉพาะในอุปกรณ์ที่สร้างขึ้น หากคุณใช้เครื่องมือจัดการรหัสผ่านบน Google และโทรศัพท์ถูกขโมย คุณสามารถเข้าสู่ระบบบัญชี Google จากอุปกรณ์อื่น (เช่น คอมพิวเตอร์) และออกจากระบบจากโทรศัพท์ที่ถูกขโมยได้จากระยะไกล ซึ่งจะทำให้เครื่องมือจัดการรหัสผ่านบน Google ในโทรศัพท์ที่ถูกขโมย ใช้งานไม่ได้ รวมถึงพาสคีย์ที่บันทึกไว้ด้วย
ในกรณีที่แย่ที่สุด หากไม่สามารถกู้คืนอุปกรณ์ที่ถูกขโมยได้ ผู้ให้บริการข้อมูลเข้าสู่ระบบที่สร้างและซิงค์พาสคีย์จะซิงค์พาสคีย์กลับไปยังอุปกรณ์ใหม่ เช่น ผู้ใช้อาจเลือกเครื่องมือจัดการรหัสผ่านบน Google เพื่อ สร้างพาสคีย์ และเข้าถึงพาสคีย์ในอุปกรณ์ใหม่ได้โดยลงชื่อ กลับเข้าสู่บัญชี Google และระบุการล็อกหน้าจอจากอุปกรณ์ก่อนหน้า
ดูข้อมูลเพิ่มเติมได้ในบทความความปลอดภัยของพาสคีย์ในเครื่องมือจัดการรหัสผ่านบน Google
การใช้งาน
พาสคีย์ใช้ได้ในอุปกรณ์ที่ใช้ Android 9 (API ระดับ 28) ขึ้นไป ระบบรองรับรหัสผ่านและการลงชื่อเข้าใช้ด้วย Google ตั้งแต่ Android 4.4 เป็นต้นไป หากต้องการ เริ่มต้นใช้งานพาสคีย์ ให้ทำตามขั้นตอนต่อไปนี้
- ทำตามCodelab ของเครื่องมือจัดการข้อมูลเข้าสู่ระบบเพื่อทำความเข้าใจเบื้องต้นเกี่ยวกับวิธีติดตั้งใช้งานพาสคีย์
- อ่านหลักเกณฑ์การออกแบบประสบการณ์ของผู้ใช้พาสคีย์ เอกสารนี้จะแสดงโฟลว์ที่แนะนำสำหรับกรณีการใช้งานของคุณ
- ศึกษาเครื่องมือจัดการข้อมูลเข้าสู่ระบบโดยทำตามคำแนะนำ
- วางแผนการใช้งานเครื่องมือจัดการข้อมูลเข้าสู่ระบบและพาสคีย์สำหรับแอปของคุณ วางแผนที่จะเพิ่มการรองรับ Digital Asset Links
ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีสร้าง ลงทะเบียน และ ตรวจสอบสิทธิ์ด้วยพาสคีย์ได้ในเอกสารประกอบสำหรับนักพัฒนาซอฟต์แวร์
การรีเซ็ตบัญชีอย่างปลอดภัย
ผู้โจมตีที่ไม่ได้รับอนุญาตซึ่งมีสิทธิ์เข้าถึงอุปกรณ์ที่ปลดล็อกแล้ว (เช่น เมื่อมีการขโมยโทรศัพท์) จะพยายามเข้าถึงแอปที่มีความละเอียดอ่อน โดยเฉพาะแอปธนาคารหรือแอปเงินสด หากแอปใช้การยืนยันด้วยข้อมูลไบโอเมตริก ผู้โจมตีจะพยายามรีเซ็ต บัญชีเพื่อเข้าถึง ขั้นตอนการรีเซ็ตบัญชีต้องไม่ขึ้นอยู่กับข้อมูลที่เข้าถึงได้ง่ายในอุปกรณ์เพียงอย่างเดียว เช่น ลิงก์รีเซ็ต OTP ทางอีเมลหรือ SMS
ต่อไปนี้คือแนวทางปฏิบัติแนะนำทั่วไปที่คุณสามารถนำไปใช้ในขั้นตอนการรีเซ็ตของแอป
- การจดจำใบหน้า นอกเหนือจาก OTP
- คำถามเพื่อความปลอดภัย
- ปัจจัยด้านความรู้ (เช่น นามสกุลก่อนแต่งงานของแม่ เมืองเกิด หรือเพลงโปรด)
- การยืนยันผ่านบัตรประจำตัว
SMS Retriever API
SMS Retriever API ช่วยให้คุณยืนยันผู้ใช้ในแอป Android ทาง SMS ได้โดยอัตโนมัติ ด้วยวิธีนี้ ผู้ใช้จึงไม่จำเป็นต้อง
พิมพ์รหัสยืนยันด้วยตนเอง นอกจากนี้ API นี้จะไม่ขอสิทธิ์เพิ่มเติมของแอปจากผู้ใช้ ซึ่งอาจเป็นสิทธิ์ที่เป็นอันตราย เช่น RECEIVE_SMS
หรือ READ_SMS
อย่างไรก็ตาม ไม่ควรใช้ SMS เป็นการยืนยันผู้ใช้เพียงอย่างเดียวเพื่อ
ป้องกันการเข้าถึงอุปกรณ์ในพื้นที่โดยไม่ได้รับอนุญาต
วิธีที่การดำเนินการนี้ช่วยลดการประพฤติมิชอบ
ผู้ใช้บางรายใช้รหัส SMS เป็นปัจจัยการตรวจสอบสิทธิ์เพียงอย่างเดียว ซึ่งเป็น จุดเริ่มต้นที่ง่ายต่อการฉ้อโกง
SMS Retriever API ช่วยให้แอปดึงรหัส SMS ได้โดยตรงโดยไม่ต้องมีการโต้ตอบจากผู้ใช้ และสามารถให้การปกป้องระดับหนึ่งจากการประพฤติมิชอบ
การใช้งาน
การติดตั้งใช้งาน SMS Retriever API มี 2 ส่วน ได้แก่ Android และเซิร์ฟเวอร์
Android: (คำแนะนำ)
- รับหมายเลขโทรศัพท์ของผู้ใช้
- เริ่มไคลเอ็นต์ SMS Retriever
- ส่งหมายเลขโทรศัพท์ไปยังเซิร์ฟเวอร์
- รับข้อความยืนยัน
- ส่ง OTP ไปยังเซิร์ฟเวอร์
เซิร์ฟเวอร์: (คำแนะนำ)
- สร้างข้อความยืนยัน
- ส่งข้อความยืนยันทาง SMS
- ยืนยัน OTP เมื่อได้รับ
แนวทางปฏิบัติแนะนำ
เมื่อผสานรวมแอปและยืนยันหมายเลขโทรศัพท์ของผู้ใช้ด้วย SMS Retriever API แล้ว แอปจะพยายามรับ OTP หากสำเร็จ นั่นเป็นสัญญาณที่ชัดเจนว่าได้รับ SMS ในอุปกรณ์โดยอัตโนมัติ หากไม่สำเร็จและผู้ใช้ต้องพิมพ์ OTP ด้วยตนเอง ก็อาจเป็นสัญญาณเตือนว่าผู้ใช้กำลังประสบปัญหาการประพฤติมิชอบ
ไม่ควรใช้ SMS เป็นกลไกการยืนยันผู้ใช้เพียงอย่างเดียว เนื่องจากอาจทำให้เกิดการโจมตีในพื้นที่ เช่น ผู้โจมตีที่ขโมยอุปกรณ์ที่ไม่ได้ล็อก หรือการโจมตีด้วยการโคลนซิม เราขอแนะนำให้ใช้ไบโอเมตริกทุกครั้งที่ทำได้ ในอุปกรณ์ที่ไม่มีเซ็นเซอร์ไบโอเมตริก การตรวจสอบสิทธิ์ของผู้ใช้ควร อาศัยปัจจัยอย่างน้อย 1 อย่างที่ไม่ได้มาจากอุปกรณ์ปัจจุบัน
ดูข้อมูลเพิ่มเติม
หากต้องการอ่านเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติแนะนำ โปรดดูแหล่งข้อมูลต่อไปนี้
- เอกสารประกอบของ Android เกี่ยวกับความปลอดภัย
- เอกสารประกอบของ Play Integrity API
- การเปลี่ยนแปลงใน Android 15
- แนวทางปฏิบัติแนะนำในการป้องกันการโทรหลอกลวงจาก Monzo Bank