HCE 기술 실전 분석

Google이 HCE의 지원을 시작하자 큰 반향을 일으켰다.SWP-SIM이 사업자에 대한 의존에서 벗어나 eSE가 휴대전화 업체에 대한 의존에서 벗어나 산업 생태에 미친 영향은 자명하다.인터넷상에서 HCE의 전망과 응용에 대한 토론은 즐겁지 않지만 기술 차원의 자료는 나무랄 데가 없다.이제 구체적인 구현을 통해 HCE의 비밀을 밝히고 기술적인 이해를 제시합니다.
우선 필요한 환경:
안드로이드 4.4.2 SDK를 지원하는 개발 환경: eclipse 플러그인이나 ADT 도구일 수 있습니다.Google 웹 사이트에서 다운로드 가능:http://developer.android.com/sdk/index.html . (이곳을 공략하면 온 하늘을 날아다니고, 모르는 학생은 스스로 수색한다)
HCE를 지원하는 테스트 핸드폰: 현재 NXP PN547을 CLF로 사용한 NFC 핸드폰이 HCE에 연결되었는지 확인할 수 있다.시중에 보이는 것은 현재 소니 엑스페리아 Z2와 삼성 갤럭시S5다.이번 테스트는 Xperia Z2를 사용합니다.(CLF칩은 핸드폰에 발표된 자료에 포함되지 않으며 최종적으로 Z2의 CLF칩인지 인터넷에서 유출된 해체도인지 확인)
참고 자료 1부:http://developer.android.com/guide/topics/connectivity/nfc/hce.html안에 매우 섬세하게 쓰여 있으니 내가 요약해 보겠다.
        1. HCE는 ISO 7816-4, 즉 ISO-DEP 레벨에서 작동합니다.(Mifare 라벨을 모방하고 싶은 학생은 씻고 자요)
        2.명령의 발송은 시스템이 SelectbyName 명령을 인수하고 HCE 서비스가 시스템의 AID에 등록하는 것을 바탕으로 이루어진다.HCE는 SE보다 더 많이 발송되며 logic channel은 지원되지 않으며 GP의 AID 부분 일치도 지원되지 않습니다.
        3.HCE는 인터페이스 함수를 통해 APDU에 응답하는 Android 서비스로 시작합니다.여러 AID(AID Group)를 구성할 수 있으며, AID 충돌 시 시스템 정책에 사용되는 결제 클래스 또는 기타 클래스를 구성할 수 있습니다.결제 클래스는 기본 적용을 설정하고 다른 클래스는 UI 팝업 선택 프롬프트를 사용합니다.
        4.화면이 꺼진 상태에서는 HCE를 사용할 수 없습니다. 화면 잠금 상태에서는 HCE가 지원을 선택하거나 잠금을 해제하고 다시 지원하라는 프롬프트를 선택할 수 있습니다.
        5.터미널에 HCE만 있고 SE가 없는 상황에서 ISO 14443-3의 비접속 매개 변수는 안드로이드가 관리하고 UID는 무작위 수를 사용하며 HCE를 사용하여 UID 기반 ID 카드를 실현하지 마십시오.
        6.Open Mobile API는 SE 액세스와 마찬가지로 HCE에 액세스할 수 없습니다.
그런 다음 인코딩을 시작하여 먼저 서비스를 수행합니다.
package com.broadthinking.hcedemo;

import android.nfc.cardemulation.HostApduService;
import android.os.Bundle;
import android.util.Log;

public class MyHostApduService extends HostApduService {

	private int messageCounter = 0;

	@Override
	public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
		if (selectAidApdu(apdu)) {
			Log.i("HCEDEMO", "Application selected");
			return getWelcomeMessage();
		}
		else {
			Log.i("HCEDEMO", "Received: " + new String(apdu));
			return getNextMessage();
		}
	}

	private byte[] getWelcomeMessage() {
		return "Hello Desktop!".getBytes();
	}

	private byte[] getNextMessage() {
		return ("Message from android: " + messageCounter++).getBytes();
	}

	private boolean selectAidApdu(byte[] apdu) {
		return apdu.length >= 2 && apdu[0] == (byte)0 && apdu[1] == (byte)0xa4;
	}

	@Override
	public void onDeactivated(int reason) {
		Log.i("HCEDEMO", "Deactivated: " + reason);
	}
}

여기서 processCommandApdu는 수신된 CAPDU를 다시 불러오는 데 사용되며 함수 반환값은 RAPDU로 사용됩니다.그러나 이 인터페이스의 호출은 프로그램 메인 창고를 사용합니다. 처리 시간이 길면 (예를 들어 클라우드 기반 처리) 처리 루트를 시작하고null로 돌아가며, 처리 루트가 끝난 후에sendResponseApdu를 주동적으로 호출해서 RAPDU를 보내야 합니다.
Android 환경 AndroidManifest를 계속 구성합니다.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.broadthinking.hcedemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="19" />

    <uses-permission android:name="android.permission.NFC" />


    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.broadthinking.hcedemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <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>
    </application>

</manifest>

몇 가지 주요 사항:
사용자 권한 부여:android.permission.NFC 서비스 권한 수여:android.permission.BIND_NFC_SERVICE exported:true initent-filter:android여야 합니다.nfc.cardemulation.action.HOST_APDU_SERVICE meta-data: 서비스의 세부 사항은 apdu 서비스 참조.xml
4
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="servicedesc"
    android:requireDeviceUnlock="false" >

    <aid-group
        android:category="other"
        android:description="aiddescription" >
        <aid-filter android:name="F0010203040506" />
        <aid-filter android:name="F0394148148100" />
    </aid-group>

</host-apdu-service>
몇 가지 주요 사항:
여러 aid-filter를 지정하여 여러 AID를 등록할 수 있습니다.category는other 또는payment로 지정할 수 있습니다.requireDeviceUnlock이false일 때는 잠금 상태에서 처리를 완료할 수 있고,true일 때는 화면을 잠금 해제해 달라고 요청할 수 있습니다.
테스트를 시작합니다.
앱을 핸드폰에 다운로드하고 화면이 켜진 상태를 유지하며 핸드폰을 비접촉 카드 리더에 넣고 APDU:00A4040007F0010203040506 또는 00A4040007F0394148148148100을 보내면 피드백을 받을 수 있습니다. 48656C6C6F204465736B746F7021. 디코딩해 보니 바로 "Hello Desktop!"에 대한 ASCII 값이 적용되었습니다.계속해서 APDU 00010000을 보내면 피드백을 받을 수 있습니다. 4D65736167652066726F6D20616E64726F69643A2030. 디코딩을 해 보면 바로 "Message from android: 0"의 ASCII 값입니다. 명령의 발송 성공을 볼 수 있습니다!
몇 마디 내뱉다.
실천과 결합하여 우리는 HCE 기술 지원이 SE를 소프트 실현하는 통로를 제공했고 서비스 실현 방식이 매우 많으며 파일을 사용할 수 있고 네트워크를 사용할 수 있으며 심지어 진정한 SE를 연결할 수 있다.구체적인 실현 방안은 구체적인 업무 수요에 의존해야 하기 때문에 인터넷에서 잘 팔리는 클라우드 방안은 그 중의 하나일 뿐이다.클라우드를 바탕으로 하는 방식은 개인적으로 좋지 않다. 안전한 측면에서 볼 때 클라우드의 방식은 데이터 안전을 보장하지만 클라이언트의 방문 안전을 어떻게 보장합니까?용이성 측면에서 볼 때 인터넷을 바탕으로 하는 카드 사용 시간의 불안정도 버스와 지하철 등 신속하게 통과해야 하는 장소에 적합하지 않다.오히려 파일 기반 방식이 아이디 카드, 포인트 카드 등 낮은 안전 등급의 만화 통합 업무에 비교적 적용된다.
클라우드 기반 HCE 지급이 명실상부한 것인지, 아니면 본인이 기술적 차원에서 이해가 부족한 것인지에 대해 지적해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기