[转]HCE技术实战分析

标签: | 发表时间:2015-04-16 04:24 | 作者:tenfyguo
出处:http://blog.csdn.net/tenfyguo

       Google开始放出HCE的支持后,掀起了巨大的反响。 摆脱了SWP-SIM对运营商的依赖,摆脱了eSE对手机厂商的依赖,其对于产业生态的影响不言而喻。网上基于HCE的前景和应用讨论的不亦乐乎,但技术层面的资料却乏善可陈。现我们就通过一个具体的实现来揭秘HCE,同时给出一个技术层面的理解。

       首先,需要的环境:

        一个支持Android 4.4.2 SDK的开发环境:可以是eclipse插件或者ADT工具。可以到google的网站上去下载: http://developer.android.com/sdk/index.html 。 (此处攻略漫天飞,搞不定的同学自己搜)

        一个支持HCE的测试手机:目前可以确定使用了NXP PN547作为CLF的NFC手机已经打通了HCE。市面上可见的目前有Sony Xperia Z2 和 Samsung Galaxy S5。本次测试使用Xperia Z2。(CLF芯片不包含在手机发布的资料里,最终确定Z2的CLF芯片还是依靠网上流出的拆机图)

        一份参考资料: 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以Android服务的方式启动,通过接口函数响应APDU。可以配置多个AID(AID Group),可以配置类型--支付类或者其它类,该类型用于AID冲突时系统的策略。支付类是通过设置默认应用,而其它类则是UI弹出选择提示。

        4.屏幕关闭的状态下HCE不可用,屏幕锁定状态下HCE可以选择支持,也可以选择提示用户解锁再支持。

        5.在终端只有HCE没有SE的情况下,ISO 14443-3的非接参数由Android接管,UID使用随机数,请勿使用HCE实现任何基于UID的ID卡。

        6.Open Mobile API并不能向访问SE一样访问HCE。

     然后,我们开始编码了,首先实现Service:

  1. package com.broadthinking.hcedemo;  
  2.   
  3. import android.nfc.cardemulation.HostApduService;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6.   
  7. public class MyHostApduService extends HostApduService {  
  8.   
  9.     private int messageCounter = 0;  
  10.   
  11.     @Override  
  12.     public byte[] processCommandApdu(byte[] apdu, Bundle extras) {  
  13.         if (selectAidApdu(apdu)) {  
  14.             Log.i("HCEDEMO", "Application selected");  
  15.             return getWelcomeMessage();  
  16.         }  
  17.         else {  
  18.             Log.i("HCEDEMO", "Received: " + new String(apdu));  
  19.             return getNextMessage();  
  20.         }  
  21.     }  
  22.   
  23.     private byte[] getWelcomeMessage() {  
  24.         return "Hello Desktop!".getBytes();  
  25.     }  
  26.   
  27.     private byte[] getNextMessage() {  
  28.         return ("Message from android: " + messageCounter++).getBytes();  
  29.     }  
  30.   
  31.     private boolean selectAidApdu(byte[] apdu) {  
  32.         return apdu.length >= 2 && apdu[0] == (byte)0 && apdu[1] == (byte)0xa4;  
  33.     }  
  34.   
  35.     @Override  
  36.     public void onDeactivated(int reason) {  
  37.         Log.i("HCEDEMO", "Deactivated: " + reason);  
  38.     }  
  39. }  

其中:processCommandApdu用以重载传入接收到的CAPDU,函数返回值作为RAPDU。但此接口的调用使用程序主栈,如果处理时间较长(比如基于云的处理),则需要启动处理线程,并返回null,并在处理线程结束后主动调用sendResponseApdu来发送RAPDU。

     继续配置Android环境 AndroidManifest.xml:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.broadthinking.hcedemo"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="19"  
  9.         android:targetSdkVersion="19" />  
  10.   
  11.     <uses-permission android:name="android.permission.NFC" />  
  12.   
  13.   
  14.     <application  
  15.         android:allowBackup="true"  
  16.         android:icon="@drawable/ic_launcher"  
  17.         android:label="@string/app_name"  
  18.         android:theme="@style/AppTheme" >  
  19.         <activity  
  20.             android:name="com.broadthinking.hcedemo.MainActivity"  
  21.             android:label="@string/app_name" >  
  22.             <intent-filter>  
  23.                 <action android:name="android.intent.action.MAIN" />  
  24.   
  25.                 <category android:name="android.intent.category.LAUNCHER" />  
  26.             </intent-filter>  
  27.         </activity>  
  28.   
  29.         <service  
  30.             android:name=".MyHostApduService"  
  31.             android:exported="true"  
  32.             android:permission="android.permission.BIND_NFC_SERVICE" >  
  33.             <intent-filter>  
  34.                 <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" />  
  35.             </intent-filter>  
  36.   
  37.             <meta-data  
  38.                 android:name="android.nfc.cardemulation.host_apdu_service"  
  39.                 android:resource="@xml/apduservice" />  
  40.         </service>  
  41.     </application>  
  42.   
  43. </manifest>  

   几个关键点:

        用户授权:android.permission.NFC
        服务授权:android.permission.BIND_NFC_SERVICE
        exported:必须为true
        initent-filter:android.nfc.cardemulation.action.HOST_APDU_SERVICE
        meta-data:指定服务的细节,见apduservice.xml

  1. <host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:description="servicedesc"  
  3.     android:requireDeviceUnlock="false" >  
  4.   
  5.     <aid-group  
  6.         android:category="other"  
  7.         android:description="aiddescription" >  
  8.         <aid-filter android:name="F0010203040506" />  
  9.         <aid-filter android:name="F0394148148100" />  
  10.     </aid-group>  
  11.   
  12. </host-apdu-service>  
  几个关键点:

          可以通过指定多个aid-filter,来注册多个AID。
          category可以指定为 other 或者 payment。
          requireDeviceUnlock为false的时候,可以在锁屏状态下完成处理,为true的时候,则会要求用户解锁屏幕。


  开始测试:

  把应用下载到手机中,保持屏幕打开状态,将手机放入非接触读卡器,发送APDU:00A4040007F0010203040506 或者 00A4040007F0394148148100, 将会得到反馈:48656C6C6F204465736B746F7021,解码一看,正是“Hello Desktop!”的ASCII值,应用的选择成功。继续发送一条APDU 00010000,将会得到反馈:4D6573736167652066726F6D20616E64726F69643A2030,解码一看,正是“Message from android: 0”的ASCII值,可以看到命令的派发成功!


  喷几句:

  结合实践,我们看到HCE技术支持提供了一个软实现SE的通路,Service实现的方式很多,可以使用文件,使用网络,甚至连接真正的SE。具体的实现方案还是要依赖于具体的业务需求,网上热炒的云方案只是其中一种。基于云的方式我个人并不看好,从安全的角度:云的方式固然保证了数据安全,但是如何保证客户端的访问安全?从易用性的角度:而基于网络导致的刷卡时间不稳定也不适合公交地铁等需要快速通过的场合。反而是基于文件的方式比较适用于ID卡,积分卡等低安全等级的一卡通整合业务。

作者:tenfyguo 发表于2015/4/15 20:24:06 原文链接
阅读:111 评论:0 查看评论

相关 [hce 技术 分析] 推荐:

[转]HCE技术实战分析

- - tenfyguo的技术专栏
       Google开始放出HCE的支持后,掀起了巨大的反响. 摆脱了SWP-SIM对运营商的依赖,摆脱了eSE对手机厂商的依赖,其对于产业生态的影响不言而喻. 网上基于HCE的前景和应用讨论的不亦乐乎,但技术层面的资料却乏善可陈. 现我们就通过一个具体的实现来揭秘HCE,同时给出一个技术层面的理解.

技术分析与行为

- 猪不鸣 - 扬韬
随着股市节节下滑,一些测底的言论逐渐多起来. 比较有影响的判断包括:历史上,底部市盈率15倍,而目前只有14倍了;历史上,底部成交量400多亿元,现在500亿元左右了;持仓账户占全部账户的比例创下新低了,意味着底部的到来;股市交易厅门可罗雀了;亏损股民扩大了;MACD底背离了;指数碰到布林线下轨了;等等.

实时统计分析技术浅谈

- - CSDN博客推荐文章
    实时统计分析技术主要是为了满足数据应用中大家对数据的变化情况有一个较高时间灵敏度需求的情况. 应用要求能够近乎及时的反映数据的整体变化情况. 那么实时统计分析的核心关键点是实时性,也就是性能. 其还伴有另一个明确的特征,就是对于要统计的内容是十分明确的.     传统上,我们的数据统计分析方法是在一个关系数据库中创建表,然后将数据存储到表中.

下一代大数据分析技术

- - Parallel Labs
原文发表于《程序员》杂志2013年第2期.. 随着以Hadoop为代表的大数据分析技术的普及,大数据的商业价值得到深入挖掘,并开始在互联网、零售、医疗、物联网等多个行业里成为商业变革的主导力量. Facebook最近就发布了名为Graph Search的新型社交搜索产品,基于海量的社交关系网络及“Likes”行为数据,为用户提供个性化的社交搜索服务,该产品被认为将是Google搜索业务的重要竞争对手.

TorPCAP:Tor网络取证分析技术

- - FreeBuf互联网安全新媒体平台
发往Tor网络的未加密网络流量,会通过运行Tor客户端计算机(如Tor浏览器)上的localhost TCP sockets来传送流量. 在本文中,我将向大家展示如何将具有localhost流量的PCAP文件,加载到 NetworkMiner 中并可视化匿名的Tor浏览. 我们称这种技术为TorPCAP.

名站技术分析 — facebook奇特的页面加载技术

- Hui Hui - 视野
没事使用代理上了下facebook,注册进入个人首页后,习惯性的查看源代码,发现了1个很有意思的现象,首页内容不少,但源代码中HTML的代码却很少,但去多出了很多段的javascript代码,这些js代码都是用于动态生成html的,facebook为什么需要这样做了. 先看看首页查看的源代码,因为源代码比较大,所以把图片压缩了下,可能看不太清楚,只需要注意图中红色是html代码,其余黑压压一片的就全部是JS代码:.

2011年技术创业公司解剖分析(图表)

- PH囧ENIX - 36氪
肯定有许多的朋友都梦想着或者已经在创建自己的公司了,但是2011年的技术创业公司大概是个什么样的情况呢. 我们一起来看一个非常有趣的图表吧,以下是经过重新编辑的图表:. 不知道朋友们看完这个图表后对创业公司的认识有没有新看法呢.

新浪微博技术架构分析-转载

- 盛开 - 人月神话的BLOG
中国首届微博开发者大会在北京举行,这是国内微博行业的首场技术盛宴. 作为国内微博市场的绝对领军者,新浪微博将在此次大会上公布一系列针对开发者的扶持政策,以期与第三方开发者联手推动微博行业的整体发展. 图为微博平台首席架构师杨卫华演讲. 大家下午好,在座的大部分都是技术开发者,技术开发者往往对微博这个产品非常关心.

深入分析 Bitcoin 的原理和技术实现

- iFunbox - FeedzShare 1天最热
来自: Hippo notes - FeedzShare  . 发布时间:2011年05月31日,  已有 9 人推荐.     Bitcoin 是一种虚拟电子货币,上周我写过一篇介绍性质的文章《通俗易懂讲解什么是 Bitcoin 虚拟货币》(http://ivarptr.blogspot.com/2011/05/bitcoin.html),当时主要参考了官方和民间的介绍材料,并没有深入了解 Bitcoin 的技术细节.