เพื่อช่วยคุณในการยืนยันผู้ใช้ เมื่อพวกเขาเริ่มต้นเรื่องที่ละเอียดอ่อน ธุรกรรม เช่น การชำระเงิน อุปกรณ์ที่รองรับซึ่งใช้ Android 9 (API) ระดับ 28) ขึ้นไป จะให้คุณใช้การยืนยันการป้องกันของ Android ได้ เมื่อใช้สิ่งนี้ แอปของคุณจะแสดงข้อความแจ้งแก่ผู้ใช้ เพื่อขอให้ผู้ใช้อนุมัติ ข้อความยืนยันความตั้งใจของลูกค้าในการทำธุรกรรมที่มีความละเอียดอ่อน
หากผู้ใช้ยอมรับข้อความดังกล่าว แอปของคุณจะใช้คีย์จาก Android Keystore ได้ เพื่อเซ็นชื่อกำกับข้อความที่แสดงในกล่องโต้ตอบ ลายเซ็นบ่งชี้อย่างมั่นใจว่าผู้ใช้ได้อ่านข้อความและยอมรับข้อความดังกล่าว
ข้อควรระวัง: การยืนยันที่ปลอดภัยของ Android ไม่ได้เป็นช่องทางข้อมูลที่ปลอดภัยสำหรับผู้ใช้ แอปของคุณไม่สามารถคาดเดาได้ การรับประกันการรักษาข้อมูลที่เป็นความลับนอกเหนือจากที่แพลตฟอร์ม Android มี โดยเฉพาะอย่างยิ่ง อย่าใช้เวิร์กโฟลว์นี้เพื่อแสดงข้อมูลที่ละเอียดอ่อนซึ่งปกติแล้วคุณจะไม่แสดงในอุปกรณ์ของผู้ใช้
หลังจากผู้ใช้ยืนยันข้อความแล้ว ข้อความจะมีความสมบูรณ์ แต่แอปของคุณยังคงต้องใช้การเข้ารหัสข้อมูลระหว่างการส่งเพื่อปกป้องความลับของข้อความที่เซ็นชื่อ
หากต้องการให้การสนับสนุนสำหรับการยืนยันผู้ใช้ที่มีความมั่นใจสูงในแอป ให้ทำตามขั้นตอนต่อไปนี้ ขั้นตอนต่อไปนี้
สร้างคีย์การลงชื่อแบบอสมมาตร โดยใช้
KeyGenParameterSpec.Builder
เมื่อสร้างคีย์ ให้ส่งtrue
ไปยังsetUserConfirmationRequired()
นอกจากนี้ ให้เรียกsetAttestationChallenge()
โดยส่งค่าการยืนยันที่เหมาะสมซึ่งระบุโดยฝ่ายที่เชื่อถือลงทะเบียนคีย์ที่สร้างขึ้นใหม่และใบรับรองเอกสารรับรองของคีย์ด้วย ฝ่ายที่ต้องพึ่งพาฝ่ายที่เหมาะสม
ส่งรายละเอียดธุรกรรมไปยังเซิร์ฟเวอร์และขอให้เซิร์ฟเวอร์สร้างและแสดงผลออบเจ็กต์ขนาดใหญ่แบบไบนารี (BLOB) ของข้อมูลเพิ่มเติม ข้อมูลเพิ่มเติมอาจรวมถึง ข้อมูลที่ได้รับการยืนยันหรือคำแนะนำในการแยกวิเคราะห์ เช่น ภาษาของสตริงข้อความแจ้ง
BLOB ต้องมีวิทยาการเข้ารหัสเพื่อการใช้งานที่ปลอดภัยมากขึ้น Nonce สำหรับการป้องกัน การโจมตีแบบเล่นซ้ำ และชี้แจงธุรกรรมให้ชัดเจน
ตั้งค่าออบเจ็กต์
ConfirmationCallback
ที่แจ้งให้แอปทราบเมื่อผู้ใช้ยอมรับข้อความแจ้งที่แสดงในกล่องโต้ตอบการยืนยันclass MyConfirmationCallback : ConfirmationCallback() { override fun onConfirmed(dataThatWasConfirmed: ByteArray?) { super.onConfirmed(dataThatWasConfirmed) // Sign dataThatWasConfirmed using your generated signing key. // By completing this process, you generate a signed statement. } override fun onDismissed() { super.onDismissed() // Handle case where user declined the prompt in the // confirmation dialog. } override fun onCanceled() { super.onCanceled() // Handle case where your app closed the dialog before the user // responded to the prompt. } override fun onError(e: Exception?) { super.onError(e) // Handle the exception that the callback captured. } }
public class MyConfirmationCallback extends ConfirmationCallback { @Override public void onConfirmed(@NonNull byte[] dataThatWasConfirmed) { super.onConfirmed(dataThatWasConfirmed); // Sign dataThatWasConfirmed using your generated signing key. // By completing this process, you generate a signed statement. } @Override public void onDismissed() { super.onDismissed(); // Handle case where user declined the prompt in the // confirmation dialog. } @Override public void onCanceled() { super.onCanceled(); // Handle case where your app closed the dialog before the user // responded to the prompt. } @Override public void onError(Throwable e) { super.onError(e); // Handle the exception that the callback captured. } }
หากผู้ใช้อนุมัติกล่องโต้ตอบ การเรียกกลับของ
onConfirmed()
จะเป็น โทรออกdataThatWasConfirmed
BLOB คือ โครงสร้างข้อมูล CBOR ที่มี นอกเหนือจากรายละเอียดอื่นๆ ข้อความแจ้งที่ผู้ใช้เห็น รวมถึงข้อความเพิ่มเติม ที่คุณส่งไปยังConfirmationPrompt
ใช้คีย์ที่สร้างไว้ก่อนหน้านี้เพื่อลงนามในdataThatWasConfirmed
BLOB จากนั้นส่ง BLOB นี้พร้อมกับลายเซ็นและรายละเอียดธุรกรรมกลับไปยังบุคคลที่เชื่อถือเพื่อใช้ประโยชน์จากการรับประกันความปลอดภัยที่ Android Protected อย่างเต็มที่ ข้อเสนอสำหรับการยืนยัน ฝ่ายที่เกี่ยวข้องต้องดำเนินการตามขั้นตอนต่อไปนี้ รับข้อความที่มีการลงนาม:
- ตรวจสอบลายเซ็นเหนือข้อความและเอกสารรับรอง ชุดใบรับรองของคีย์การลงชื่อ
- ตรวจสอบว่าใบรับรองการรับรองมีการตั้งค่า Flag
TRUSTED_CONFIRMATION_REQUIRED
ซึ่งบ่งบอกว่าคีย์การรับรองต้องได้รับการยืนยันจากผู้ใช้ที่เชื่อถือ หากคีย์การรับรองเป็นคีย์ RSA ให้ตรวจสอบว่าไม่มีพร็อพเพอร์ตี้PURPOSE_ENCRYPT
หรือPURPOSE_DECRYPT
- ตรวจสอบ
extraData
เพื่อให้แน่ใจว่าข้อความยืนยันนี้เป็นของ คำขอใหม่และยังไม่มีการดำเนินการ ขั้นตอนนี้ช่วยป้องกันต่อการโจมตีด้วยการเล่นซ้ำ - แยกวิเคราะห์
promptText
เพื่อดูข้อมูลเกี่ยวกับการดำเนินการหรือคำขอที่ยืนยันแล้ว โปรดทราบว่าpromptText
คือส่วนเดียวของข้อความที่ผู้ใช้ยืนยัน ฝ่ายที่เชื่อถือต้องไม่ถือว่าข้อมูลที่อยู่ระหว่างการยืนยันซึ่งรวมอยู่ในextraData
สอดคล้องกับpromptText
เพิ่มตรรกะคล้ายกับที่แสดงในข้อมูลโค้ดต่อไปนี้เพื่อแสดงกล่องโต้ตอบ
// This data structure varies by app type. This is an example. data class ConfirmationPromptData(val sender: String, val receiver: String, val amount: String) val myExtraData: ByteArray = byteArrayOf() val myDialogData = ConfirmationPromptData("Ashlyn", "Jordan", "$500") val threadReceivingCallback = Executor { runnable -> runnable.run() } val callback = MyConfirmationCallback() val dialog = ConfirmationPrompt.Builder(context) .setPromptText("${myDialogData.sender}, send ${myDialogData.amount} to ${myDialogData.receiver}?") .setExtraData(myExtraData) .build() dialog.presentPrompt(threadReceivingCallback, callback)
// This data structure varies by app type. This is an example. class ConfirmationPromptData { String sender, receiver, amount; ConfirmationPromptData(String sender, String receiver, String amount) { this.sender = sender; this.receiver = receiver; this.amount = amount; } }; final int MY_EXTRA_DATA_LENGTH = 100; byte[] myExtraData = new byte[MY_EXTRA_DATA_LENGTH]; ConfirmationPromptData myDialogData = new ConfirmationPromptData("Ashlyn", "Jordan", "$500"); Executor threadReceivingCallback = Runnable::run; MyConfirmationCallback callback = new MyConfirmationCallback(); ConfirmationPrompt dialog = (new ConfirmationPrompt.Builder(getApplicationContext())) .setPromptText("${myDialogData.sender}, send ${myDialogData.amount} to ${myDialogData.receiver}?") .setExtraData(myExtraData) .build(); dialog.presentPrompt(threadReceivingCallback, callback);
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับการยืนยันที่ปลอดภัยของ Android ได้จากแหล่งข้อมูลต่อไปนี้