给你一张SIM卡,你可以用作校园卡,也可用作羊城通,技术上你要如何实现?
业界给的答案:超级SIM卡(一张可以通过nfc刷卡的电话卡,简称nfc-sim)
技术上你要如何实现?
在实际场景的应用中,可以简化成简单的三个步骤:
-
数据初始化
-
数据传输
-
数据处理
技术上你要如何实现?只需要关注下这三个问题:1. SIM卡数据怎么初始化?2. SIM卡数据怎么传输?3. 一卡通系统怎么处理数据?
一、常见卡片
1、卡片种类
(注意:超级SIM卡是双面卡,同时支持接触式和非接触式来交互数据)
image2、卡片介绍
-
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模式就是使用这块区域)
image三、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,存贮结构如下图所示:
image-
第0扇区的块0 (即绝对地址0 块),它用于存放厂商代码,已经固化,不可更改。
-
每个扇区的块0、块1、块2 为数据块,可用存贮数据,可以进行初始化值、加值、减值、读值操作;
-
每个扇区的块3 为控制块,包括了密码A、存取控制、密码B。具体结构如下:
3、密码机制
M1卡通过密码A、存取控制、密码B三者共同控制数据块的读写权限,极为巧妙。
(1)控制位定义
表:控制位定义"CXxy" (大写X=控制位序号,每块共3个控制位; y=块0,块1,块2)
image例如:C1x0中的C代码这是控制位,1代表第一位,0代表是块0的控制位。
(2)控制位在存储控制中的存放位置
image(3)三个控制位的权限控制表
一个扇区的三个数据块,我们可以利用密码机制对它们分别进行权限控制
数据块(块0、块1、块2)的存取控制如下:
image控制块(块3)的存取控制与数据块(块0、1、2)不同,它的存取控制如下:
image四、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文件提高资源效率。
image4、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
image2. 打开电脑客户端,连接读卡器
image- 调用C++ SDK(读卡器厂商负责封装),向读卡器发出读数指令
- 正确获取指定块的数据
六、一卡通系统如何处理数据?
一卡通系统通过POS机获取到返回数据,后台执行处理。
一卡通管理后台一般分为web端和客户端:
-
web端技术栈推荐springboot+vue,开发成本低但是兼容性欠佳;
-
客户端目前技术潮流推荐JavaFx,可以兼顾性能、开发成本和兼容性三个问题。
网友评论