给你一张SIM卡,你可以用作校园卡,也可用作羊城通,技术上你要如何实现?
业界给的答案:超级SIM卡(一张可以通过nfc刷卡的电话卡,简称nfc-sim)
技术上你要如何实现?
在实际场景的应用中,可以简化成简单的三个步骤:
数据初始化
数据传输
数据处理
技术上你要如何实现?只需要关注下这三个问题:1. SIM卡数据怎么初始化?2. SIM卡数据怎么传输?3. 一卡通系统怎么处理数据?
一、常见卡片
1、卡片种类
(注意:超级SIM卡是双面卡,同时支持接触式和非接触式来交互数据)
2、卡片介绍
ID卡:是一种不可写入的感应式卡,有一个固定卡号,卡号在封卡前写入后不可再更改,封卡后只能读卡号。
M1卡:含有存储器,数据读写需要秘钥,数据直接读写在存储器上。
普通CPU卡:以复旦微电子的FM1208卡为例,含有cpu,ram和rom,内置一个cos系统,内置多个文件,每个文件读写需要密钥(内外两重验证)。
JavaCard:同样含有cpu,ram和rom,内置一个cos系统,在系统上安装JCVM虚拟机,可以部署多个java applet应用;
3、卡片的供电方式
主要分为接触式和非接触式:
接触式:芯片向外暴露有6个触点,插入机器后,手机卡槽的探针接触芯片供电;
非接触式:通过读卡器发出电磁波,切割铜线生电;
工作原理:读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存。当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。
二、超级SIM卡的物理特性
1、物理特性
缺少总部的超级SIM卡技术文档,目前对超级SIM卡的物理特性了解不多
卡片实现:默认是JavaCard的CPU卡,在CPU卡区域模拟了一个1K大小的M1卡;
容量大小:480K左右,能安装15个java applet应用;
供电方式:手机接触式充电,驱动手机NFC模块以对外交互数据。因此手机没电关机后,剩余的电量还能支撑驱动NFC模块使用(并无评测数据,为总部反馈数据)
工作频率:13.56MHz
数据交互:支持手机系统通过本地oma调用,利用sim卡的两个触点传输数据;也支持手机用NFC模块驱动超级SIM卡,在13.56MHz频率下与POS读写器通过电磁波交互数据。
2、物理结构
CPU:处理器单元
RAM:用于存放临时数据
ROM:用于存放系统程序,用户不可修改
EEPROM:用于号码、短信等数据,可擦写的程序等(超级SIM卡的M1模式就是使用这块区域)
三、M1卡的技术实现
M1卡是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,目前都有国产芯片与其兼容,属于非接触式IC卡。最为重要的优点是可读可写并且安全性高的多功能卡。这些优点与其自身的结构密不可分。
1、主要指标
分为16 个扇区,每个扇区为4 块,每块16 个字节,以块为存取单位
每个扇区有独立的一组密码及访问控制
每张卡有唯一序列号,为32 位
具有防冲突机制,支持多卡操作
无电源,自带天线,内含加密控制逻辑和通讯逻辑电路
数据保存期为10 年,可改写10 万次,读无限次
工作温度:-20℃~50℃(温度为90%), PET 材料封装得M1 卡,温度可达100℃。
工作频 :13.56MHZ
通信速 :106KBPS
读写距离:10cm 以内(与读写器有关)
2、存储结构
M1 卡分为16 个扇区,每个扇区由4 块 (块0、块1、块2、块3)组成,(我们也将16 个扇区的64 个块按绝对地址编号为0~63,存贮结构如下图所示:
第0扇区的块0 (即绝对地址0 块),它用于存放厂商代码,已经固化,不可更改。
每个扇区的块0、块1、块2 为数据块,可用存贮数据,可以进行初始化值、加值、减值、读值操作;
每个扇区的块3 为控制块,包括了密码A、存取控制、密码B。具体结构如下:
3、密码机制
M1卡通过密码A、存取控制、密码B三者共同控制数据块的读写权限,极为巧妙。
(1)控制位定义
表:控制位定义"CXxy" (大写X=控制位序号,每块共3个控制位; y=块0,块1,块2)
例如:C1x0中的C代码这是控制位,1代表第一位,0代表是块0的控制位。
(2)控制位在存储控制中的存放位置
(3)三个控制位的权限控制表
一个扇区的三个数据块,我们可以利用密码机制对它们分别进行权限控制
数据块(块0、块1、块2)的存取控制如下:
控制块(块3)的存取控制与数据块(块0、1、2)不同,它的存取控制如下:
四、JavaCard卡的技术实现
1、什么是JAVA卡?
JAVA卡是一种可以运行JAVA程序的智能卡。该智能卡由CPU、EEPROM(存储)、RAM(内存)、加密协处理等组成,很像一台小型的PC,主要用于安全服务场景。
2、工作模型
JAVA卡上电以后系统就会自动运行,主机通过发送APDU访问JAVA卡的功能。JAVA卡只接受2种APDU:选择应用APDU(系统实现),应用功能APDU(应用实现)。
典型工作流:
JAVA卡上电
发送APDU选择应用1 –> JAVA卡调度应用1 –> 发送功能APDU -> 应用1响应功能APDU
发送APDU选择应用2 –> JAVA卡调度应用2 –> 发送功能APDU -> 应用2响应功能APDU
JAVA卡下电
JAVA卡虚拟机:解释执行JAVA字节码指令。
JAVA卡标准API:是J2SE的一个子集,详情请参考下面:1. java.lang,定义Object和Throwable等基础类
2. javacard.framework,核心框架类(应用框架、消息传输、瞬时内存、事务处理等)
3. javacard.security,定义安全框架基础类
4. javacardx.crypto,定义了Cipher和KeyEncryption等基础类
5. org.globalplatform,GP规范的应用编程接口
JAVA卡私有API:卡商自定义的API,提供提供附加实用功能。
JAVA卡应用:系统自带的应用或用户编写的应用,系统自带的应用必须有Card Manager(AID=A000000003000000),负责上传应用、安装应用、删除应用、其他管理功能等。
APDU:定义了主机和JAVA卡之间交互的数据格式,JAVA卡由process方法处理APDU。
3、编写、生成JAVA卡应用
1、利用JAVA卡的API编写JAVA应用代码。
2、编译JAVA应用代码为Class字节码(注意必须使用JDK1.5编译,或在eclipse中设置,因为转换工具只支持这个版本)。
3、利用converter.bat(参见java_card_kit-2_2_2使用介绍,JCOP支持自动生成)将Class文件和Export文件(链接信息)转换为CAP应用文件。
说明:因为JAVA卡平台CPU主频比较低,存储和内存都很受限,所以要转换为CAP文件提高资源效率。
4、JavaCard应用代码样例
package random;/**
Get random number from JavaCard.
*/
import javacard.framework.;import javacard.security.;
public class RandomNumberApplet extends Applet {
private RandomData randomData; public RandomNumberApplet() { randomData = RandomData.getInstance(RandomData.ALG_SECURE_RANDOM); } public static void install(byte[] bArray, short bOffset, byte bLength) { // GP-compliant JavaCard applet registration
new RandomNumberApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]); }
public void process(APDU apdu) { // Good practice: Return 9000 on SELECT
if (selectingApplet()) { return; }
byte[] buf = apdu.getBuffer(); switch (buf[ISO7816.OFFSET_INS]) { case (byte) 0x84: short randomLen = buf[4]; randomData.generateData(buf, (short)0, randomLen); apdu.setOutgoingAndSend((short)0, randomLen); break; default: // good practice: If you don't know the INStruction, say so:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); } }
}
5、CPU卡通用错误码
6200 “警告 信息未提供”
6281 “警告 回送数据可能”
6282 “警告 文件长度小于Le”
6283 “警告 选中的文件无效”
6284 “警告 FCI格式与P2指定的不符”
6300 “警告 鉴别失败”
63Cx “警告 校验失败(x-允许重试次数)”
6400 “状态标志位没有变”
6581 “内存失败”
6700 “长度错误”
6882 “不支持安全报文”
6981 “命令与文件结构不相容,当前文件非所需文件”
6982 “操作条件(AC)不满足,没有校验PIN”
6983 “您的卡已被锁定”
6984 “随机数无效,引用的数据无效”
6985 “使用条件不满足”
6986 “不满足命令执行条件(不允许的命令,INS有错)”
6987 “MAC丢失”
6988 “MAC不正确”
698D “保留”
6A80 “数据域参数不正确”
6A81 “功能不支持;创建不允许;目录无效;应用锁定”
6A82 “该文件未找到”
6A83 “该记录未找到”
6A84 “文件预留空间不足”
6A86 “P1或P2不正确”
6A88 “引用数据未找到”
6B00 “参数错误”
6Cxx “Le长度错误,实际长度是xx”
6E00 “不支持的类:CLA有错”
6F00 “数据无效”
6F01 “连接中断”
6D00 “不支持的指令代码”
9301 “您的卡余额不足”
9302 “MAC2错误”
9303 “应用被永久锁定”
9401 “您的卡余额不足”
9402 “交易计数器达到最大值”
9403 “密钥索引不支持”
9406 “所需MAC不可用”
6900 “不能处理”
6901 “命令不接受(无效状态)”
61xx “正常 需发GET RESPONSE命令” 读取指令00C00000xx
6600 “接收通讯超时”
6601 “接收字符奇偶错”
6602 “校验和不对”
6603 “警告 当前DF文件无FCI”
6604 “警告 当前DF下无SF或KF”
6E81 “卡片已离开”
五、如何用POS机读写卡数据
1、POS机的选型
M1、CPU卡都是13.56MHz,但是POS机不一定都能读取,这个要看POS机的固件是否支持。一般市面上分2种,后者价格更高。
只能读取M1卡
能读取M1和CPU卡
2、读写M1卡数据
1.手机安装SIM卡并设置好NFC选项为SIM
2. 打开电脑客户端,连接读卡器
- 调用C++ SDK(读卡器厂商负责封装),向读卡器发出读数指令
- 正确获取指定块的数据
六、一卡通系统如何处理数据?
一卡通系统通过POS机获取到返回数据,后台执行处理。
一卡通管理后台一般分为web端和客户端:
web端技术栈推荐springboot+vue,开发成本低但是兼容性欠佳;
客户端目前技术潮流推荐JavaFx,可以兼顾性能、开发成本和兼容性三个问题。