ภาพรวมโปรแกรมจำลองการ์ดแบบโฮสต์

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

Android 4.4 ขึ้นไปมีวิธีการจำลองการ์ดเพิ่มเติมที่ ไม่เกี่ยวข้องกับองค์ประกอบที่ปลอดภัย ซึ่งเรียกว่าการจำลองการ์ดแบบโฮสต์ ช่วงเวลานี้ อนุญาตให้แอปพลิเคชัน Android จำลองบัตรและพูดกับ NFC โดยตรง ผู้อ่าน หัวข้อนี้จะอธิบายวิธีการทํางานของการจำลองการ์ดแบบโฮสต์ (HCE) Android และวิธีที่คุณสามารถพัฒนาแอปที่จำลองบัตร NFC โดยใช้

การจำลองการ์ดที่มีองค์ประกอบความปลอดภัย

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

แผนภาพด้วยโปรแกรมอ่าน NFC ที่เคลื่อนผ่านตัวควบคุม NFC เพื่อดึงข้อมูลจากองค์ประกอบความปลอดภัย
รูปที่ 1 การจำลองบัตร NFC พร้อมองค์ประกอบความปลอดภัย

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

การจำลองการ์ดแบบโฮสต์

เมื่อมีการจำลองบัตร NFC โดยใช้การจำลองการ์ดแบบโฮสต์ จะมีการกำหนดเส้นทางข้อมูล ไปยัง CPU ของโฮสต์โดยตรงแทนที่จะส่งไปยังองค์ประกอบความปลอดภัย รูปที่ 2 จะแสดงวิธีการทำงานของการจำลองการ์ดแบบโฮสต์

แผนภาพที่มีเครื่องอ่าน NFC ผ่านตัวควบคุม NFC เพื่อดึงข้อมูลจาก CPU
รูปที่ 2 การจำลองบัตร NFC ที่ไม่มีองค์ประกอบความปลอดภัย

บัตรและโปรโตคอล NFC ที่รองรับ

แผนภาพแสดงสแต็กโปรโตคอล HCE
รูปที่ 3 สแต็กโปรโตคอล HCE ของ Android

มาตรฐาน NFC ให้การสนับสนุนสำหรับโปรโตคอลต่างๆ มากมาย และมี ประเภทต่างๆ ที่คุณสามารถจำลองได้

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

กล่าวโดยเจาะจงคือ Android 4.4 ขึ้นไปสนับสนุนการ์ดจำลองที่อิงตาม ข้อกำหนด ISO-DEP ของ NFC-Forum (อิงตาม ISO/IEC 14443-4) และกระบวนการ Application Protocol Data Units (APDU) ตามที่กำหนดไว้ใน ISO/IEC 7816-4 Android บังคับให้จำลอง ISO-DEP ที่ด้านบนของ Nfc-A เท่านั้น (ISO/IEC 14443-3 ประเภท A) การรองรับ Nfc-B (ISO/IEC 14443-4 ประเภท B) เทคโนโลยีนั้นเป็นตัวเลือก รูปที่ 3 จะแสดงถึงการวางเลเยอร์ทั้งหมดนี้

บริการ HCE

สถาปัตยกรรม HCE ใน Android นั้นอิงตาม Android Service คอมโพเนนต์ (หรือที่เรียกว่า HCE บริการ) หนึ่งในข้อได้เปรียบที่สำคัญของบริการคือสามารถทำงานใน ที่ไม่มีอินเทอร์เฟซผู้ใช้ใดๆ นี่คือความเหมาะสมสำหรับ HCE จำนวนมาก เช่น บัตรสะสมคะแนนหรือบัตรโดยสาร ซึ่งผู้ใช้ไม่ควรต้องใช้ เปิดแอปเพื่อใช้งาน แต่จะเริ่มต้นการแตะอุปกรณ์กับเครื่องอ่าน NFC แทน บริการที่ถูกต้องหากไม่ได้ทำงานอยู่และดำเนินการธุรกรรม ในเบื้องหลัง แน่นอนว่าคุณสามารถเปิดใช้งาน UI เพิ่มเติม (เช่น การแจ้งเตือนผู้ใช้) จากบริการของคุณตามความเหมาะสม

การเลือกบริการ

ระบบ Android จำเป็นต้องทราบว่าผู้ใช้แตะอุปกรณ์กับเครื่องอ่าน NFC บริการ HCE ที่โปรแกรมอ่าน NFC ต้องการสื่อสารด้วย ISO/IEC 7816-4 กำหนดวิธีเลือกแอปพลิเคชันโดยมีจุดศูนย์กลางอยู่ที่ รหัสแอปพลิเคชัน (AID) AID ประกอบด้วยข้อมูลไม่เกิน 16 ไบต์ หากคุณกำลังจำลอง สำหรับโครงสร้างพื้นฐานของเครื่องอ่าน NFC ที่มีอยู่ เอดส์ที่เครื่องอ่านเหล่านี้ มักเป็นที่รู้จักกันดีและได้รับการจดทะเบียนต่อสาธารณะ (ตัวอย่างเช่น เอดส์ของเครือข่ายการชำระเงิน เช่น Visa และ MasterCard)

ถ้าคุณต้องการปรับใช้โครงสร้างพื้นฐานผู้อ่านใหม่สำหรับแอปพลิเคชันของคุณ จะต้องลงทะเบียนเอดส์เอง ดูขั้นตอนการลงทะเบียนโรคเอดส์ได้ใน ตามข้อกำหนด ISO/IEC 7816-5 เราขอแนะนำให้ลงทะเบียน AID ตาม 7816-5 ถ้าคุณทำให้แอปพลิเคชัน HCE สำหรับ Android ใช้งานได้ เนื่องจากเพื่อหลีกเลี่ยงการชนกัน กับแอปพลิเคชันอื่นๆ

กลุ่มเอดส์

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

รายการเอดส์ที่มีการเก็บไว้ด้วยกันเรียกว่า "กลุ่ม AID" สำหรับโรคเอดส์ทั้งหมดใน Android รับประกันการดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้

  • ระบบจะกำหนดเส้นทางให้ AID ทั้งหมดในกลุ่มไปยังบริการ HCE นี้
  • ไม่มีการกำหนดเส้นทางเอดส์ในกลุ่มไปยังบริการ HCE นี้ (ตัวอย่างเช่น เนื่องจาก ผู้ใช้ต้องการบริการอื่นที่ขอเอดส์อย่างน้อย 1 รายการในกลุ่มของคุณ ด้วย)

กล่าวอีกนัยหนึ่งคือ ไม่มีระหว่างรัฐที่เอดส์บางรายการในกลุ่มสามารถ ไปยังบริการ HCE บริการหนึ่ง และไปยังอีกบริการหนึ่ง

กลุ่มและหมวดหมู่ AID

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

Android 4.4 ขึ้นไปรองรับ 2 หมวดหมู่ ดังนี้

  • CATEGORY_PAYMENT (ครอบคลุมแอปการชำระเงินมาตรฐานอุตสาหกรรม)
  • CATEGORY_OTHER (สำหรับแอป HCE อื่นๆ ทั้งหมด)

ใช้บริการ HCE

หากต้องการจำลองบัตร NFC โดยใช้การจำลองบัตรที่เป็นโฮสต์ คุณจะต้องสร้าง Service ที่จัดการธุรกรรม NFC

ตรวจสอบการสนับสนุน HCE

แอปพลิเคชันของคุณสามารถตรวจสอบว่าอุปกรณ์รองรับ HCE หรือไม่โดยตรวจหา FEATURE_NFC_HOST_CARD_EMULATION ใช้<uses-feature> ในไฟล์ Manifest ของแอปพลิเคชันเพื่อประกาศว่าแอปของคุณใช้ HCE และจำเป็นที่จะต้องทำให้แอปทำงานหรือไม่

การติดตั้งใช้งานบริการ

Android 4.4 ขึ้นไปมีคลาส Service อำนวยความสะดวกที่คุณใช้ได้ พื้นฐานสำหรับการติดตั้งใช้งานบริการ HCE ได้แก่ HostApduService ชั้นเรียน

ขั้นตอนแรกคือการขยาย HostApduService ดังที่แสดงในโค้ดต่อไปนี้ ตัวอย่าง:

Kotlin

class MyHostApduService : HostApduService() {

    override fun processCommandApdu(commandApdu: ByteArray, extras: Bundle?): ByteArray {
       ...
    }

    override fun onDeactivated(reason: Int) {
       ...
    }
}

Java

public class MyHostApduService extends HostApduService {
    @Override
    public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
       ...
    }
    @Override
    public void onDeactivated(int reason) {
       ...
    }
}

HostApduService ประกาศเมธอด Abtract 2 รายการที่คุณต้องลบล้างและ สำหรับการใช้งานจริง หนึ่งในนั้น processCommandApdu() ถูกเรียกเมื่อโปรแกรมอ่าน NFC ส่ง Application Protocol Data Unit (APDU) กับบริการของคุณ APDU ได้รับการกำหนดไว้ตามข้อกำหนด ISO/IEC 7816-4 APDU คือแพ็กเก็ตระดับแอปพลิเคชันที่มีการแลกเปลี่ยนระหว่างโปรแกรมอ่าน NFC กับ บริการ HCE ของคุณ โปรโตคอลระดับแอปพลิเคชันนั้นเป็นแบบ Half-duplex คือโปรแกรมอ่าน NFC ส่งคำสั่ง APDU ให้คุณ และรอให้คุณส่ง APDU ตอบสนอง ผลตอบแทน

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

คุณสามารถส่ง APDU การตอบสนองโดยการส่งคืนไบต์ของ APDU การตอบสนองจาก processCommandApdu() โปรดทราบว่าจะมีการเรียกใช้เมธอดนี้ในเทรดหลัก ของแอปพลิเคชันของคุณโดยที่คุณไม่ควรบล็อก หากคำนวณและส่งคืนไม่ได้ APDU ตอบสนองทันที แสดงผล Null จากนั้นคุณจะสามารถดำเนินการที่จำเป็นกับ ชุดข้อความอื่นและใช้ sendResponseApdu() ที่กำหนดไว้ในคลาส HostApduService เพื่อส่งคำตอบเมื่อคุณ เสร็จสิ้น

Android จะส่งต่อ APDU ใหม่จากเครื่องอ่านไปยังบริการของคุณต่อไปจนกว่า ดังต่อไปนี้

  • เครื่องอ่าน NFC จะส่ง SELECT AID APDU อีกรายการ ซึ่งระบบปฏิบัติการแปลงเป็น บริการต่างๆ
  • ลิงก์ NFC ระหว่างเครื่องอ่าน NFC กับอุปกรณ์ของคุณเสีย

ในทั้ง 2 กรณีนี้ ชั้นเรียน onDeactivated() จะเรียกการติดตั้งใช้งานพร้อมด้วยอาร์กิวเมนต์ที่ระบุสิ่งใดใน 2 กรณีที่เกิดขึ้น

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

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

การประกาศไฟล์ Manifest ของบริการและการลงทะเบียนเอดส์

คุณต้องประกาศบริการในไฟล์ Manifest ตามปกติ แต่ต้องเพิ่ม เพิ่มเติมไว้ในการประกาศบริการด้วย

  1. เพื่อบอกแพลตฟอร์มว่าเป็นบริการ HCE ที่ติดตั้งใช้งาน HostApduService ให้เพิ่มตัวกรอง Intent สำหรับ SERVICE_INTERFACE ดำเนินการกับการประกาศบริการของคุณ

  2. หากต้องการระบุแพลตฟอร์มที่บริการนี้ร้องขอกลุ่มเอดส์ ให้ระบุข้อมูลต่อไปนี้ CANNOT TRANSLATE SERVICE_META_DATA แท็ก <meta-data> ในการประกาศบริการซึ่งชี้ไปยัง XML ที่มีข้อมูลเพิ่มเติมเกี่ยวกับบริการ HCE

  3. ตั้งค่าแอตทริบิวต์ android:exported เป็น true และกำหนดให้ต้องมีแอตทริบิวต์ สิทธิ์ android.permission.BIND_NFC_SERVICE ในการประกาศบริการของคุณ การตั้งค่าแรกช่วยให้มั่นใจได้ว่าแอปพลิเคชันภายนอกจะผูกกับบริการได้ จากนั้นจะบังคับใช้เฉพาะแอปพลิเคชันภายนอกที่ระงับ สิทธิ์ android.permission.BIND_NFC_SERVICE ผูกกับบริการของคุณได้ เนื่องจาก android.permission.BIND_NFC_SERVICE เป็นสิทธิ์ของระบบ บังคับใช้อย่างมีประสิทธิภาพว่ามีเฉพาะระบบปฏิบัติการ Android เท่านั้นที่สามารถเชื่อมโยงกับบริการของคุณได้

ต่อไปนี้คือตัวอย่างของการประกาศไฟล์ Manifest HostApduService

<service android:name=".MyHostApduService" android:exported="true"
         android:permission="android.permission.BIND_NFC_SERVICE">
    <intent-filter>
        <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
    </intent-filter>
    <meta-data android:name="android.nfc.cardemulation.host_apdu_service"
               android:resource="@xml/apduservice"/>
</service>

แท็กข้อมูลเมตานี้ชี้ไปที่ไฟล์ apduservice.xml ต่อไปนี้เป็น ตัวอย่างของไฟล์ที่มีการประกาศกลุ่ม AID เดียวที่มี เอดส์ที่เป็นกรรมสิทธิ์:

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
           android:description="@string/servicedesc"
           android:requireDeviceUnlock="false">
    <aid-group android:description="@string/aiddescription"
               android:category="other">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</host-apdu-service>

แท็ก <host-apdu-service> ต้องมีแอตทริบิวต์ <android:description> ที่มีรายละเอียดบริการที่แสดงได้ง่าย UI ของแอป คุณสามารถใช้แอตทริบิวต์ requireDeviceUnlock เพื่อระบุว่า มีการปลดล็อกอุปกรณ์ก่อนที่คุณจะเรียกใช้บริการนี้เพื่อจัดการ APDU

<host-apdu-service> ต้องมีแท็ก <aid-group> อย่างน้อย 1 แท็ก ชิ้น ต้องใช้แท็ก <aid-group> เพื่อทำสิ่งต่อไปนี้

  • มีแอตทริบิวต์ android:description ที่มีแท็กที่ใช้ง่าย คำอธิบายของกลุ่ม AID ซึ่งเหมาะสำหรับการแสดงใน UI
  • ตั้งค่าแอตทริบิวต์ android:category เพื่อระบุหมวดหมู่เป็น AID เป็นของกลุ่ม เช่น ค่าคงที่สตริงที่กำหนดโดย CATEGORY_PAYMENT หรือ CATEGORY_OTHER
  • มีแท็ก <aid-filter> อย่างน้อย 1 แท็ก โดยแต่ละแท็กจะมี AID เพียงรายการเดียว ระบุ AID ในรูปแบบเลขฐาน 16 และตรวจสอบว่ามีเลขคู่ จำนวนอักขระสูงสุด

แอปพลิเคชันของคุณยังต้องกำหนด NFC ได้รับสิทธิ์ในการจดทะเบียนเป็น HCE

การแก้ปัญหาความขัดแย้งเกี่ยวกับเอดส์

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

ในบางหมวดหมู่ เช่น การชำระเงิน ผู้ใช้อาจเลือกค่าเริ่มต้นได้ ใน UI การตั้งค่า Android สำหรับหมวดหมู่อื่นๆ นโยบายอาจดำเนินการ ถามผู้ใช้เสมอว่าจะเรียกใช้บริการใดในกรณีที่มีข้อขัดแย้ง สำหรับข้อมูล เกี่ยวกับวิธีค้นหานโยบายการระงับข้อขัดแย้งสำหรับหมวดหมู่ใดหมวดหมู่หนึ่ง โปรดดู getSelectionModeForCategory()

ตรวจสอบว่าบริการของคุณเป็นค่าเริ่มต้นหรือไม่

แอปพลิเคชันสามารถตรวจสอบว่าบริการ HCE เป็นบริการเริ่มต้นสำหรับ ในบางหมวดหมู่โดยใช้ isDefaultServiceForCategory() API

หากบริการของคุณไม่ใช่บริการเริ่มต้น คุณขอให้ตั้งบริการเป็นค่าเริ่มต้นได้ โดยใช้ ACTION_CHANGE_DEFAULT

แอปพลิเคชันการชำระเงิน

Android จะพิจารณาบริการ HCE ที่ได้ประกาศกลุ่ม AID ที่มี การชำระเงินเป็นแอปพลิเคชันการชำระเงิน Android 4.4 ขึ้นไปมี รายการเมนูการตั้งค่าระดับบนสุดที่เรียกว่าแตะ & pay ซึ่งแจกแจงทั้งหมด แอปพลิเคชันการชำระเงินดังกล่าว ในเมนูการตั้งค่านี้ ผู้ใช้สามารถเลือก แอปพลิเคชันการชำระเงินเริ่มต้นที่จะเรียกใช้เมื่อมีการแตะเครื่องชำระเงิน

เนื้อหาที่จำเป็นสำหรับการสมัครชำระเงิน

แอปพลิเคชันการชำระเงินของ HCE เพื่อมอบประสบการณ์ของผู้ใช้ที่ดึงดูดสายตามากขึ้น ต้องแสดงแบนเนอร์บริการ

Android 13 ขึ้นไป

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

Android 12 และต่ำกว่า

ตั้งขนาดของแบนเนอร์บริการเป็น 260x96 dp จากนั้นกำหนดขนาดของแบนเนอร์บริการ ในไฟล์ XML ข้อมูลเมตาโดยการเพิ่มแอตทริบิวต์ android:apduServiceBanner ลงใน แท็ก <host-apdu-service> ซึ่งชี้ไปยังทรัพยากรที่ถอนออกได้ ต่อไปนี้เป็นตัวอย่าง:

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:description="@string/servicedesc"
        android:requireDeviceUnlock="false"
        android:apduServiceBanner="@drawable/my_banner">
    <aid-group android:description="@string/aiddescription"
               android:category="payment">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</host-apdu-service>

ลักษณะการทำงานเมื่อปิดหน้าจอและหน้าจอล็อก

ลักษณะการทำงานของบริการ HCE จะแตกต่างกันไปตามเวอร์ชันของ Android ที่ใช้ อุปกรณ์

Android 12 ขึ้นไป

ในแอปที่กำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไป คุณสามารถเปิดใช้ NFC ได้ การชำระเงินโดยไม่ต้องเปิดหน้าจอของอุปกรณ์โดยการตั้งค่า requireDeviceScreenOn ถึง false

Android 10 ขึ้นไป

อุปกรณ์ที่ใช้ Android 10 (API ระดับ 29) ขึ้นไปมีการสนับสนุน ปลอดภัย NFC ขณะปลอดภัย NFC เปิดอยู่ โปรแกรมจำลองบัตรทั้งหมด (แอปพลิเคชันโฮสต์และแอปพลิเคชันนอกโฮสต์) ไม่พร้อมใช้งานเมื่อหน้าจอของอุปกรณ์ปิดอยู่ ขณะที่ "รักษาความปลอดภัยของ NFC" ปิดอยู่ ไม่ใช้โฮสต์ แอปพลิเคชันที่พร้อมใช้งานเมื่อหน้าจอของอุปกรณ์ปิดอยู่ คุณสามารถตรวจสอบ รักษาความปลอดภัยการสนับสนุน NFC โดยใช้ isSecureNfcSupported()

ในอุปกรณ์ที่ใช้ Android 10 ขึ้นไป ฟังก์ชันการทำงานเดียวกันสำหรับการตั้งค่า android:requireDeviceUnlock กับ true จะมีผลเหมือนกับอุปกรณ์ ใช้ Android 9 และต่ำกว่า แต่เฉพาะเมื่อปิด "รักษาความปลอดภัยของ NFC" เท่านั้น กล่าวคือ หาก รักษาความปลอดภัยของ NFC เปิดอยู่ บริการ HCE ทำงานจากหน้าจอล็อกไม่ได้ ไม่ว่าการตั้งค่าของ android:requireDeviceUnlock จะเป็นอย่างไรก็ตาม

Android 9 และต่ำกว่า

ในอุปกรณ์ที่ใช้ Android 9 (API ระดับ 28) และต่ำกว่า ตัวควบคุม NFC และ ตัวประมวลผลแอปพลิเคชันจะปิดโดยสมบูรณ์เมื่อหน้าจอ อุปกรณ์ปิดอยู่ ดังนั้นบริการ HCE จะไม่ทำงานเมื่อปิดหน้าจอ

นอกจากนั้น บริการ HCE ยังทำงานจากหน้าจอล็อกใน Android 9 และต่ำกว่าได้ด้วย แต่การควบคุมนี้ควบคุมโดยแอตทริบิวต์ android:requireDeviceUnlock ใน แท็ก <host-apdu-service> ของบริการ HCE โดยค่าเริ่มต้น การปลดล็อกอุปกรณ์จะเป็น และบริการของคุณจะมีการเรียกใช้แม้ว่าอุปกรณ์จะล็อกอยู่

หากคุณตั้งค่าแอตทริบิวต์ android:requireDeviceUnlock เป็น true สำหรับ HCE Android จะแจ้งให้ผู้ใช้ปลดล็อกอุปกรณ์ในกรณีต่อไปนี้ เกิดขึ้น:

  • ผู้ใช้แตะที่อ่าน NFC
  • เครื่องอ่าน NFC จะเลือก AID ที่สามารถแก้ปัญหาให้กับบริการของคุณได้

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

การใช้งานระบบร่วมกับการ์ดองค์ประกอบความปลอดภัย

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

การใช้งานระบบร่วมกันนี้อิงตามหลักการที่เรียกว่าการกำหนดเส้นทาง AID NFC ตัวควบคุมจะเก็บตารางการกำหนดเส้นทางที่ประกอบด้วยรายการการกำหนดเส้นทาง (แบบจำกัด) ไว้ กฎ กฎการกำหนดเส้นทางแต่ละข้อจะมี AID และปลายทาง ปลายทางสามารถ เป็น CPU ของโฮสต์ ที่กำลังใช้งานแอป Android หรือมีการรักษาความปลอดภัยที่เชื่อมต่อ

เมื่อเครื่องอ่าน NFC ส่ง APDU ที่มี SELECT AID ตัวควบคุม NFC จะแยกวิเคราะห์ และตรวจสอบว่า AID ตรงกับ AID ใดในตารางการกำหนดเส้นทางหรือไม่ หาก ตรงกัน รายการ APDU และ APDU ทั้งหมดที่ตามมาจะส่งไปยังปลายทาง ที่เชื่อมโยงกับ AID จนกว่าจะได้รับ SELECT AID APDU อีกครั้งหรือ NFC ลิงก์เสีย

รูปที่ 4 แสดงสถาปัตยกรรมนี้:

แผนภาพที่โปรแกรมอ่าน NFC สื่อสารกับทั้งองค์ประกอบที่ปลอดภัยและ CPU
รูปที่ 4 Android ที่ทำงานด้วยทั้งการจำลององค์ประกอบที่ปลอดภัยและการจำลองการ์ดโฮสต์

โดยทั่วไปแล้วตัวควบคุม NFC จะมีเส้นทางเริ่มต้นสำหรับ APDU ด้วย เมื่อ ไม่พบ AID ในตารางการกำหนดเส้นทาง ระบบจะใช้เส้นทางเริ่มต้น ขณะที่รายการนี้ การตั้งค่าอาจแตกต่างกันไปในแต่ละอุปกรณ์ ต้องใช้อุปกรณ์ Android เพื่อให้มั่นใจว่าจะมีการส่งเอดส์ที่แอปของคุณลงทะเบียนไปยัง เป็นโฮสต์

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

ส่วนต่อไปนี้จะอธิบายวิธีประกาศโปรแกรมเอดส์สำหรับแอปพลิเคชันที่ใช้ องค์ประกอบความปลอดภัยสำหรับการจำลองการ์ด

การลงทะเบียน AID ขององค์ประกอบความปลอดภัย

แอปพลิเคชันที่ใช้องค์ประกอบความปลอดภัยสำหรับการจำลองการ์ดสามารถประกาศ บริการนอกโฮสต์ในไฟล์ Manifest คำประกาศบริการดังกล่าวเป็น แทบจะเหมือนกับการประกาศบริการ HCE ข้อยกเว้นมีดังนี้ ดังต่อไปนี้:

  • ต้องตั้งค่าการดำเนินการที่ใช้ในตัวกรอง Intent เป็น SERVICE_INTERFACE
  • ต้องตั้งค่าแอตทริบิวต์ชื่อข้อมูลเมตาเป็น SERVICE_META_DATA
  • ไฟล์ XML ของข้อมูลเมตาต้องใช้แท็กราก <offhost-apdu-service>

    <service android:name=".MyOffHostApduService" android:exported="true"
           android:permission="android.permission.BIND_NFC_SERVICE">
      <intent-filter>
          <action android:name="android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE"/>
      </intent-filter>
      <meta-data android:name="android.nfc.cardemulation.off_host_apdu_service"
                 android:resource="@xml/apduservice"/>
    </service>
    

ต่อไปนี้เป็นตัวอย่างของไฟล์ apduservice.xml ที่เกี่ยวข้อง การลงทะเบียนโรคเอดส์ 2 รายการ ได้แก่

<offhost-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
           android:description="@string/servicedesc">
    <aid-group android:description="@string/subscription" android:category="other">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</offhost-apdu-service>

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

ต้องระบุแอตทริบิวต์ android:apduServiceBanner สำหรับบริการนอกโฮสต์ ที่เป็นแอปพลิเคชันการชำระเงิน และสามารถเลือกเป็นการชำระเงินเริ่มต้นได้ แอปพลิเคชัน

การเรียกใช้บริการนอกโฮสต์

Android จะไม่เริ่มต้นหรือเชื่อมโยงกับบริการที่ประกาศว่า "นอกโฮสต์" เนื่องจากธุรกรรมจริงจะดำเนินการโดยองค์ประกอบความปลอดภัย ไม่ใช่โดย บริการของ Android การประกาศบริการอนุญาตให้แอปพลิเคชัน การลงทะเบียนเอดส์ที่มีอยู่ในองค์ประกอบความปลอดภัย

HCE และความปลอดภัย

สถาปัตยกรรม HCE มอบความปลอดภัยที่สำคัญอย่างหนึ่งเนื่องจาก บริการได้รับการปกป้องโดย BIND_NFC_SERVICE สิทธิ์ของระบบ มีเพียงระบบปฏิบัติการเท่านั้นที่สามารถเชื่อมโยงและสื่อสารกับบริการของคุณ วิธีนี้ช่วยให้มั่นใจว่า APDU ใดๆ ที่คุณได้รับนั้นเป็น APDU ที่จริงๆ แล้วได้รับ ระบบปฏิบัติการจากตัวควบคุม NFC และ APDU ที่คุณส่งกลับไปจะนำไปเฉพาะ เป็นระบบปฏิบัติการ ซึ่งจะส่งต่อ APDU ไปยังตัวควบคุม NFC โดยตรง

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

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

พารามิเตอร์และรายละเอียดของโปรโตคอล

ส่วนนี้น่าสนใจสําหรับนักพัฒนาซอฟต์แวร์ที่ต้องการทําความเข้าใจโปรโตคอล พารามิเตอร์ HCE ที่อุปกรณ์ใช้ระหว่างขั้นตอนการป้องกันการชนและการเปิดใช้งาน โปรโตคอล NFC ซึ่งช่วยให้สร้างโครงสร้างพื้นฐานสำหรับผู้อ่าน ใช้ได้กับอุปกรณ์ Android HCE

การเปิดใช้งานโปรโตคอล Nfc-A (ISO/IEC 14443 ประเภท A)

ระบบจะแลกเปลี่ยนเฟรมหลายเฟรมเพื่อเป็นส่วนหนึ่งของการเปิดใช้งานโปรโตคอล Nfc-A

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

เครื่องอ่าน NFC จะเลือกอุปกรณ์ HCE ในภายหลังได้โดยส่ง SEL_REQ คำสั่ง การตอบสนอง SEL_RES ของอุปกรณ์ HCE มีบิตที่ 6 เป็นอย่างน้อย (0x20) ซึ่งบ่งชี้ว่าอุปกรณ์รองรับ ISO-DEP โปรดทราบว่าส่วนบิตอื่นๆ ใน อาจตั้งค่า SEL_RES ได้ด้วย ตัวอย่างเช่น การรองรับ NFC-DEP (p2p) เนื่องจากอาจมีการตั้งค่าบิตอื่นๆ ผู้อ่านที่ต้องการโต้ตอบกับ อุปกรณ์ HCE ควรตรวจสอบอย่างชัดเจนสำหรับบิตที่ 6 เท่านั้น และไม่เปรียบเทียบ SEL_RES ที่สมบูรณ์ที่มีค่า 0x20

การเปิดใช้งาน ISO-DEP

หลังจากเปิดใช้งานโปรโตคอล Nfc-A แล้ว โปรแกรมอ่าน NFC จะเริ่มต้น ISO-DEP การเปิดใช้งานโปรโตคอล จะส่ง RATS (ขอให้ตอบเพื่อเลือก) คำสั่ง ตัวควบคุม NFC จะสร้างการตอบสนอง RATS ซึ่งก็คือ ATS ATS ไม่ใช่ กำหนดค่าโดยบริการ HCE อย่างไรก็ตาม การใช้งาน HCE ต้องเป็นไปตามฟอรัม NFC ข้อกำหนดสำหรับการตอบสนอง ATS เพื่อให้เครื่องอ่าน NFC วางใจในพารามิเตอร์เหล่านี้ได้ เป็นไปตามข้อกำหนดของฟอรัม NFC สำหรับอุปกรณ์ HCE ทุกเครื่อง

ส่วนด้านล่างแสดงรายละเอียดเพิ่มเติมเกี่ยวกับไบต์แต่ละไบต์ของ ATS การตอบสนองจากตัวควบคุม NFC ในอุปกรณ์ HCE:

  • TL: ระยะเวลาของการตอบสนอง ATS ต้องไม่ระบุความยาวเกิน 20 ไบต์
  • T0: ต้องตั้งค่าบิต 5, 6 และ 7 ในอุปกรณ์ HCE ทั้งหมด ซึ่งหมายถึง TA(1), TB(1) และ TC(1) จะรวมอยู่ในการตอบสนองของ ATS บิต 1 ถึง 4 หมายถึง FSCI ขนาดเฟรมสูงสุด ในอุปกรณ์ HCE ค่าของ FSCI ต้องเป็น ระหว่าง 0 ชม. ถึง 8 ชม.
  • T(A)1: กำหนดอัตราบิตระหว่างโปรแกรมอ่านและโปรแกรมจำลอง รวมถึงกำหนดอัตราบิต ไม่สมมาตร ไม่มีข้อกำหนดหรือการรับประกันอัตราบิตสำหรับอุปกรณ์ HCE
  • T(B)1: บิตที่ 1 ถึง 4 ระบุจำนวนเต็มของเวลาป้องกันเฟรมเริ่มต้น (SFGI) เปิด อุปกรณ์ HCE, SFGI ต้อง <= 8 ชม. บิตที่ 5 ถึง 8 ระบุการรอเฟรม จำนวนเต็ม (FWI) และกำหนดช่วงเวลารอเฟรม (FWT) ในอุปกรณ์ HCE, FWI ต้อง <= 8 ชม.
  • T(C)1: บิต 5 หมายถึงการรองรับ "คุณสมบัติโปรโตคอลขั้นสูง" อุปกรณ์ HCE อาจสนับสนุนหรือไม่รองรับ "ฟีเจอร์โปรโตคอลขั้นสูง" บิต 2 หมายถึงการรองรับ สำหรับ DID อุปกรณ์ HCE อาจรองรับ DID หรือไม่ก็ได้ บิต 1 หมายถึงการรองรับ NAD อุปกรณ์ HCE ต้องไม่รองรับ NAD และต้องตั้งค่าบิต 1 เป็น 0
  • ไบต์ที่ผ่านมา: อุปกรณ์ HCE อาจแสดงข้อมูลที่ผ่านมาได้สูงสุด 15 ไบต์ NFC ผู้อ่านที่ยินดีจะโต้ตอบกับบริการ HCE ไม่ควรต้องคาดเดา เนื้อหาของไบต์ที่ผ่านมาหรือการมีอยู่

โปรดทราบว่าอุปกรณ์ HCE จำนวนมากมีแนวโน้มที่จะเป็นไปตามข้อกำหนดของโปรโตคอล เครือข่ายการชำระเงินรวมของ EMVCo ได้ระบุไว้ในส่วน "Contactless โปรโตคอลการสื่อสาร" โดยเฉพาะอย่างยิ่ง:

  • FSCI ใน T0 ต้องอยู่ระหว่าง 2 ชั่วโมงถึง 8 ชั่วโมง
  • T(A)1 จะต้องตั้งค่าเป็น 0x80 ซึ่งหมายความว่ามีเพียงอัตราบิต 106 kbit/s เท่านั้น และไม่มีการรองรับอัตราบิตแบบไม่สมมาตรระหว่างเครื่องอ่านกับโปรแกรมจำลอง ที่รองรับ
  • FWI ใน T(B)1 ต้องน้อยกว่า 7 ชั่วโมง

การแลกเปลี่ยนข้อมูล APDU

ดังที่กล่าวไว้ก่อนหน้านี้ การติดตั้งใช้งาน HCE จะรองรับแชแนลเชิงตรรกะเพียงช่องทางเดียวเท่านั้น การพยายามเลือกแอปพลิเคชันในช่องทางตรรกะต่างๆ ไม่ได้ผล อุปกรณ์ HCE