1,  问:能否在AndroidNFC手机上实现卡模拟?

答:在技术上可行,但是,对一般开发人员来讲,目前看来仅仅是技术上可行:(

2,  问:具体如何实现呢?

答:有两种方式:一种是基于硬件的,被称为虚拟卡模式(Virual Card Mode);一种是基于软件的,被称为主机卡模式(Host Card Mode)。

在虚拟卡模式下,需要提供安全模块SE,NFC芯片作为非接触通讯前端,将从外部读写器接收到命令,转发到SE,然后由SE进行回复。

外部读写器 <--->  NFC芯片 <---> SE。

而在主机卡模式下,不需要提供SE,而是由在手机中运行的一个应用完成SE的功能。

外部读写器 <--->  NFC芯片 <--->  主机上的应用

3,  问:SE是个什么东西,一般手机上有吗?

答:SE可以理解成一个CPU卡,一般是带有JAVA虚拟机的CPU卡,即JAVA卡。带有NFC芯片的手机一般都带有SE(也可能有例外),例如GOOGLE NEXUS手机的PN65N,就是PN544芯片加SmartMX安全模块。此外,SE也可以是特殊的SIM卡或SD卡。

4,  问:我要做基于硬件的卡模拟,如何实现?

答:首先开发在SE中运行的程序,即一个JAVA APPLET,它负责将从NFC芯片接收到命令进行解释,处理和回复。然后,需要开发一个主机应用程序,能够将APPLET下载到SE中,并激活运行。当然,如果是完整的移动支付系统,还要包括后台应用,TSM等

5,  问:SE如何与主机通信?如何才能将程序下载到SE呢?

答:根据SE硬件的不同,SE与主机的硬件接口也有所不同。对内置的SE,一般是NFCWI接口,而SIM和SD卡可能是SWP接口。应用接口协议是ISO7816-4,即CPU卡APDU命令。熟悉CPU卡的都知道,没有密钥,根本无法完成对卡的写操作。因此需要SE的操作密钥。但不幸的是,这些密钥都掌握在手机厂商(内置SE的情况),例如三星,HTC,或移动运营商(SIM的情况),或者银行等安全模块提供商(SD卡的情况)手中,一般开发人员是得不到这些权限的。

6,  问:那么没有密钥的情况下,基于硬件能做到什么程度呢?

答:目前看来,对SE进行只读访问应该是可能的。例如在安装GOOGLE钱包后,在SE中会创建GOOGLE钱包的APPLET,我们可以通过程序选择该APPLET并发送一些查询命令。仅此而已…

7,  问:如何实现基于软件的卡模拟?

答:目前,官方Android版本不支持,可以通过刷第三方ROM实现基于软件的卡模拟,例如Cyanogenmod。(具了解,Android4.4 KitKat能支持NFC软件卡模拟,支持ISODEP类型(CPU卡),UID为随机ID,不能在关机和关屏幕下使用,通过AID路由可以与硬件卡模拟应用程序共存。)

8,  问:卡模拟一般能模拟什么卡?

答:取决于软件和硬件双方的限制。一般虚拟卡模拟主要取决于硬件,通常支持TYPE A/B的卡,对于专有协议的卡,就看芯片厂商是否支持了。例如用NXP的芯片,可以方便的模拟M1和ULTRALIGHT等,而是用其它家的芯片就不一定支持了。主机卡模拟一般只支持ISO14443-4以上的卡。

9,  问:基于软件的卡模拟有什么问题吗?

答:主要是安全问题,对应用在移动支付领域的应用,安全总是最重要的,而手机上的运行环境很不安全。

10,问:总体看来,对一般开发人员,有没有实现在android NFC手机上卡模拟,并进行商业化的可能 ?

答:综上所述,主机卡模式存在严重的安全问题,而且在目前官方Android版本不支持的情况下,不可能要求用户刷机以支持一个应用。因此主机卡模式目前只能是一个技术上的研究,而没有商业应用的可能性。对虚拟卡模式,SE掌握在手机厂商,移动运营商或银行等行业巨头手中,根据目前的趋势,一般应用开发者可以采用与这些巨头合作,取得SE的部分使用权,一般是建立一个应用的安全域,以加载自己的虚拟卡。中小应用开发者也可以考虑自己发行基于SD或外置模块的SE,但是自行发卡的成本很高,终端用户一般也不会认可。

十问Android NFC手机上的卡模拟(转)的更多相关文章

  1. NFC手机上基于软件的卡模拟 重大利好还是安全噩梦?(转)

    Software Card Emulation in NFC-enabled Mobile Phones: GreatAdvantage or Security Nightmare? Michael ...

  2. Android 检查手机上是否安装了指定的软件(根据包名检测)

    Android检查手机上是否安装了指定的软件(根据包名检测) /** * 检查手机上是否安装了指定的软件 * @param context * @param packageName * @return ...

  3. Android检查手机上是否安装了第三方软件的方法------本文以百度地图为例

    package com.example.myapi.thirdbaidumap; import java.net.URISyntaxException; import java.util.ArrayL ...

  4. 设定十分钟android在状态栏上集成的开源project推荐

    1.前言 于android kitkat 有一个新功能可以设置背景的手机状态栏,让手机风的整个界面格是一致的,它看起来非常酷,在今年的google i/o向上android l这样的风格.来如今看我们 ...

  5. [Android] 判断手机上是否安装了某个程序

    http://blog.csdn.net/xiaodongrush/article/details/9320135 1. 首先得到该程序的包名 这个连上手机ADB,看logcat就能看到.比如:QQ客 ...

  6. Android 调用手机上第三方百度地图并传值给地图

    //移动APP调起Android百度地图方式举例 Intent intent = null; try { // intent = Intent.getIntent("intent://map ...

  7. 如何在 Android 安卓手机上运行 Node.js 应用 | 如何在安卓手机配置node开发环境

    最近在学习js,由于没法随身携带笔记本电脑,在手机翻阅<JavaScript高级程序设计>时,时常想调试一下书中的代码.于是就有了,能否在手机上配置一个js开发环境.考虑到手机上的Chro ...

  8. 在Android中访问内置SE和基于SE的卡模拟(一)

    2013-10-10 编写 前言 在“十问Android NFC手机上的卡模拟”文中仅仅简单的介绍了一下相关的概念,如果需要了解基于SE的卡模拟的更多细节,也就是,究竟在Android的NFC手机上, ...

  9. 【转】Android NFC学习笔记

    一:NFC的tag分发系统 如果想让android设备感应到NFC标签,你要保证两点 1:屏幕没有锁住 2:NFC功能已经在设置中打开 当系统检测到一个NFC标签的时候,他会自动去寻找最合适的acti ...

随机推荐

  1. win8 中如何删除 共享文件夹 用户名和密码

    在访问共享文件夹时我们都喜欢选中记住用户名和密码,可是有时候密码输入错误或者密码修改了,这时就需要我们删除或则修改先前记住的用户名和密码记录. 首先进入:控制面板\所有控制面板项\凭据管理器 选择wi ...

  2. Openfire XMPP Smack RTC IM 即时通讯 聊天 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. CSS3动画的回调处理

    我们在做js动画的时候,很多时候都需要做回调处理,如在一个动画完成后触发一个事件.一个动画完成后执行另外一个动画等等,但在使用CSS3动画时能不能捕获到运动的状态做回调处理呢? CSS3动画也是可以做 ...

  4. Linux下配置nfs并远程挂载

    nfs是网络文件系统,允许一个节点通过网络访问远程计算机的文件系统,远程文件系统可以被直接挂载到本地,文件操作和本地没有区别,如果是局域网的nfs那么io的性能也可以保证,下面就以CentOS 7.x ...

  5. 65. XPages自定义控件(三)高级搜索之三

    RecordView控件的两个文件的完整代码在本文末尾给出.虽说完整,仅靠这两个文件,RecordView控件还不能正常工作,因为在这两个文件里还引用了其他自定义控件,调用了作为managed bea ...

  6. 建模角度理解word embedding及tensorflow实现

    http://www.jianshu.com/p/d44ce1e3ec2f 1. 前言 本篇主要介绍关键词的向量表示,也就是大家熟悉的word embedding.自Google 2013 年开源wo ...

  7. [干货]Kaggle热门 | 用一个框架解决所有机器学习难题

    新智元推荐 来源:LinkedIn 作者:Abhishek Thakur 译者:弗格森 [新智元导读]本文是数据科学家Abhishek Thakur发表的Kaggle热门文章.作者总结了自己参加100 ...

  8. 对象序列化与反序列化(二进制 byte[])

    .序列化 public static byte[] SerializeObject(object obj) { if (obj == null) return null; MemoryStream m ...

  9. MFC如何获取硬盘的序列号

    要把如下的两篇文章结合起来看: qt怎么获取硬盘序列号,是不是没戏? http://www.qtcn.org/bbs/simple/?t65637.html system("wmic pat ...

  10. create-react-app时registry的奇怪问题

    用React官方给的NPM脚本 create-react-app my-app 在自动安装module的过程中,在安装registry的组件的时候莫名其妙的挂住不动了.界面显示的信息如下: fetch ...