อุปกรณ์ที่รองรับซึ่งใช้ Android 9 (ระดับ API 28) ขึ้นไปจะให้คุณใช้ Android Protected Confirmation เพื่อช่วยยืนยันความตั้งใจของผู้ใช้เมื่อเริ่มทำธุรกรรมที่มีความละเอียดอ่อน เช่น การชำระเงิน เมื่อใช้เวิร์กโฟลว์นี้ แอปจะแสดงข้อความแจ้งแก่ผู้ใช้เพื่อขอให้ผู้ใช้อนุมัติข้อความสั้นๆ ที่ยืนยันเจตนาของผู้ใช้ในการทำธุรกรรมที่มีความละเอียดอ่อนให้เสร็จสมบูรณ์
หากผู้ใช้ยอมรับคำชี้แจง แอปของคุณจะใช้คีย์จาก Android Keystore เพื่อรับรองข้อความที่แสดงในกล่องโต้ตอบได้ ลายเซ็นบ่งบอกด้วยความมั่นใจสูงมากว่าผู้ใช้ได้เห็นคำชี้แจงและยอมรับแล้ว
ข้อควรระวัง: Android Protected Confirmation ไม่ได้ให้ช่องทางข้อมูลที่ปลอดภัยสำหรับผู้ใช้ แอปของคุณไม่สามารถถือว่ามีการรับประกันการรักษาข้อมูลที่เป็นความลับนอกเหนือจากที่แพลตฟอร์ม Android มีให้ โดยเฉพาะอย่างยิ่ง อย่าใช้เวิร์กโฟลว์นี้เพื่อแสดงข้อมูลที่ละเอียดอ่อนซึ่งโดยปกติแล้วคุณจะไม่แสดงในอุปกรณ์ของผู้ใช้
หลังจากผู้ใช้ยืนยันข้อความแล้ว ความสมบูรณ์ของข้อความจะได้รับการรับรอง แต่แอปของคุณยังคงต้องใช้การเข้ารหัสข้อมูลที่อยู่ระหว่างการส่งเพื่อปกป้องความลับของข้อความที่ลงนาม
หากต้องการรองรับการยืนยันผู้ใช้ที่มีความเชื่อมั่นสูงในแอป ให้ทำตามขั้นตอนต่อไปนี้
สร้างคีย์ Signing แบบไม่สมมาตรโดยใช้คลาส
KeyGenParameterSpec.Builderเมื่อสร้างคีย์ ให้ส่งtrueไปยังsetUserConfirmationRequired()นอกจากนี้ ให้เรียกใช้setAttestationChallenge()โดยส่งค่าคำถามที่เหมาะสมซึ่งระบุโดยฝ่ายที่เกี่ยวข้องลงทะเบียนคีย์ที่สร้างขึ้นใหม่และใบรับรองเอกสารรับรองของคีย์กับฝ่ายที่เกี่ยวข้องที่เหมาะสม
ส่งรายละเอียดธุรกรรมไปยังเซิร์ฟเวอร์ของคุณ แล้วให้เซิร์ฟเวอร์สร้างและแสดงผลออบเจ็กต์ขนาดใหญ่แบบไบนารี (BLOB) ของข้อมูลเพิ่มเติม ข้อมูลเพิ่มเติมอาจรวมถึงข้อมูลที่ต้องยืนยันหรือคำแนะนำในการแยกวิเคราะห์ เช่น ภาษาของสตริงพรอมต์
เพื่อให้การติดตั้งใช้งานปลอดภัยยิ่งขึ้น BLOB ต้องมี Nonce แบบเข้ารหัสเพื่อป้องกันการโจมตีแบบเล่นซ้ำและเพื่อแก้ความกำกวมของธุรกรรม
ตั้งค่าออบเจ็กต์
ConfirmationCallbackที่จะแจ้งให้แอปทราบเมื่อผู้ใช้ยอมรับข้อความแจ้งที่แสดงในกล่องโต้ตอบการยืนยัน ดังนี้Kotlin
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. } }
Java
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. } }
หากผู้ใช้อนุมัติกล่องโต้ตอบ ระบบจะเรียกใช้ Callback
onConfirmed()BLOBdataThatWasConfirmedเป็นโครงสร้างข้อมูล CBOR ที่มีรายละเอียดอื่นๆ เช่น ข้อความแจ้งที่ผู้ใช้เห็น รวมถึงข้อมูลเพิ่มเติมที่คุณส่งไปยังเครื่องมือสร้างConfirmationPromptใช้คีย์ที่สร้างไว้ก่อนหน้านี้เพื่อลงนาม BLOBdataThatWasConfirmedจากนั้นส่ง BLOB นี้พร้อมกับลายเซ็นและรายละเอียดธุรกรรมกลับไปยังฝ่ายที่เกี่ยวข้องหากต้องการใช้ประโยชน์จากการรับประกันความปลอดภัยที่ Android Protected Confirmation มอบให้อย่างเต็มที่ ฝ่ายที่เชื่อถือต้องทำตามขั้นตอนต่อไปนี้เมื่อได้รับข้อความที่ลงชื่อแล้ว
- ตรวจสอบลายเซ็นในข้อความ รวมถึงชุดใบรับรองเอกสารรับรองของคีย์การลงนาม
- ตรวจสอบว่าใบรับรองเอกสารรับรองมีการตั้งค่าแฟล็ก
TRUSTED_CONFIRMATION_REQUIREDซึ่งบ่งชี้ว่าคีย์การรับรองต้องได้รับการยืนยันจากผู้ใช้ที่เชื่อถือได้ หากคีย์การรับรองเป็นคีย์ RSA ให้ตรวจสอบว่าไม่มีพร็อพเพอร์ตี้PURPOSE_ENCRYPTหรือPURPOSE_DECRYPT - ตรวจสอบ
extraDataเพื่อให้แน่ใจว่าข้อความยืนยันนี้เป็นของคำขอใหม่และยังไม่ได้ดำเนินการ ขั้นตอนนี้จะช่วยป้องกันการโจมตีแบบ Replay Attack - แยกวิเคราะห์
promptTextเพื่อดูข้อมูลเกี่ยวกับการดำเนินการหรือคำขอที่ยืนยันแล้ว โปรดทราบว่าpromptTextเป็นเพียงส่วนเดียวของข้อความที่ผู้ใช้ยืนยันจริงๆ ฝ่ายที่อาศัยข้อมูลต้องไม่ถือว่าข้อมูลที่ต้องยืนยันซึ่งรวมอยู่ในextraDataสอดคล้องกับpromptText
เพิ่มตรรกะที่คล้ายกับที่แสดงในข้อมูลโค้ดต่อไปนี้เพื่อแสดงกล่องโต้ตอบ:
Kotlin
// 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)
Java
// 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 Protected Confirmation ได้ที่แหล่งข้อมูลต่อไปนี้