JAVA卡与智能卡

什么是 JAVA 卡呢?JAVA 卡是一种可以运行 JAVA 程序的接触式微处理器智能卡。1996 年 11 月,JAVA 卡 1.0 版本的规范正式发布了。如今 JAVA 卡最新的规范已经到了 2.1 版。

相信对智能卡比较了解的读者一定会问:智能卡的出现和使用已经快有二十年了,为什么会在最近出现 JAVA 卡的呢?为什么 JAVA 卡会变得如此受欢迎?为了回答这个问题,我们先来回顾一下 JAVA 卡出现之前的智能卡,看看它存在着什么样的问题。

JAVA卡之前的智能卡

早期的智能卡主要是以一种介质形式出现的,它可以在卡体内存储金额,从而能在公共电话机或自动售货机上被使用。它完成的是一种存储信息的应用。这时卡的需求量并不大。同时卡的应用也不多。而近来,随着智能卡地越来越“智能”,由于智能卡的优点越来越被人认可,它的应用范围也越来越广泛:从银行的借贷卡,存放个人医疗信息的医疗卡,到有线和无线网络的安全模块卡等等。智能卡的应用可以说是涉及到了各个领域,几乎每个人都要与智能卡打交道。市场的需求量急剧上升,同时越来越多的智能卡新应用也随之诞生。

但与智能卡需求量急剧上升所矛盾的是:智能卡应用的研发是一个复杂漫长的过程。尽管对智能卡的结构大小和通信协议,国际规范 ISO7816 早已规定,但各个卡生产商对智能卡的研制都各不相同。各个卡生产商对自己的智能卡操作都有自己独特的一套指令集。
此外,智能卡编程接口(APIs)非常复杂,用之编程,需要开发人员非常熟悉低层通信接口协议,内存管理和一些智能卡硬件的细节。因此,在开发智能卡应用之前,开发人员就需要花费大量时间来了解智能卡的复杂开发环境,而且在他们研究后会发现并不存在现代化的开发工具(象 Visual Studio 那样工具)。更糟糕的是:对不同的智能卡并没有一个通用的开发环境。每次你要开发一种新的应用,可能你都必须从新了解一种新的开发环境。

情况有可能还没有这么简单。由于所有的智能卡都是在专门的开发环境中开发出来的,不同的卡的生产商生产出来的相同应用的卡可能并不兼容,这使同一系统中使用不同生产商的卡变得很复杂。
据估计,2001 年,智能卡的需求量为 10-30 亿片。而了解智能卡编程的人员少之又少。智能卡编程的复杂性,不统一性将严重阻碍智能卡的发展。市场的需求为智能卡的发展提出了新的要求。然而这一切将随着 JAVA 卡的出现而改变。

JAVA卡的出现

JAVA 卡是一种可以运行 JAVA 程序的接触式微处理器智能卡,在卡中运行的程序叫 Applet。Applet 可以动态装载到 JAVA 卡上。JAVA 卡的 API(JAVA Card 2.1.1 Application Programming Interfaces Specification )为智能卡制定了一个 JAVA 语言的特殊子集。如今95%智能卡制造商已经支持了 JAVA 卡的 API。JAVA 卡和 JAVA 卡 API 的出现使智能卡的编程变得既快又简单,同时这些卡的应用程序(Applet)可以在任何支持 JAVA 卡 API 的智能卡上运行。可以说 JAVA 卡的出现立刻解决了 JAVA 卡出现之前智能卡所遇到的问题。
JAVA 卡是如何完成这一巨大的功能的呢?原来在 JAVA 卡内有一个能执行 JAVA 字节码(Applet)的 JAVA 虚拟机-它提供一整套标准的 JAVA 卡编程的 API,使得开发人员无需了解复杂的智能卡硬件和智能卡专用的技术,就可以进行智能卡应用的开发,从而大大减少开发时间和降低开发难度。据粗略的统计,用 JAVA 来编程可以比用 C 语言来编程节约 60% 的开发时间,如与智能卡特殊的汇编语言来比,这种优势将更为明显。同时由于 JAVA 虚拟机的使用,JAVA 卡的 Applet 能够在不同卡片的 JCAE(JAVA Card Application Environment)上执行,即透过 JAVA 虚拟机的机制来达到跨平台的能力。

JAVA 是一种面对对象的编程语言,智能卡的基于对象的 API 大大简化了卡内 Applet 与终端或后台服务器的通信。

JAVA 卡的另一巨大优势是:开发人员可以任意选择他们所熟悉和喜欢的开发工具。由于对 JAVA 卡的编程是用 JAVA 语言,所有几乎当今所有流行的 JAVA 开发环境,如 VJ++,Vcafe 等,都可以被用来进行 JAVA 卡的开发。正因如此,快速完成和调试 JAVA 卡的应用程序也变为了可能。而在这之前,调试卡的应用程序是一个极复杂漫长的过程,因为应用程序首先要被装载到卡的 ROM 中,而装载到卡的 ROM 中的程序是无法更新的,所以对一个应用程序的调试将占用大量的时间。

同时由于任何 JAVA 开发人员都可以变为 JAVA 卡开发人员,这就为智能卡的发展提供了强有力的保证。
JAVA 卡还有两大优点:支持一卡多用途和重用。支持一卡多用途是指 JAVA 卡上可以同时存在多个不同的应用。这些应用可以来自同一个卡供应商,也可以来自不同的卡供应商。这样一张 JAVA 卡就可以完成不同的功能,例如,它可以有电子钱包功能,同时也可以有身份鉴别功能。重用是指 JAVA 卡上的应用可以根据需要进行删除或重新添加新的应用,而无需更换新的智能卡,这样大大增强智能卡的灵活性。
综上所述,JAVA 卡的出现统一了智能卡的编程接口(API),统一了智能卡的编程语言(JAVA 语言),为智能卡的更大范围的使用提供了基础,真正使智能卡行业成为一个统一标准的产业。

JAVA卡的结构

可以说 JAVA 卡是 JAVA 平台中最小的子集。JAVA 卡 2.1 的规范可以在 http://www.javasoft.com/javacard 这个网址得到。JAVA 卡 2.1 规范主要包括有:JAVA 卡虚拟机规范,JAVA 卡编程接口(API)和 JAVA 卡运行环境规范。

JAVA 卡有点象一部功能齐全,但规模较小的电脑,其硬件主要是为了保证 JAVA 卡的运行环境的需要,其最小的硬件配置要求为:

512 bytes RAM:主要用于存放程序执行时的堆栈、暂存资料以及做为I/O的缓冲区。

24 KB ROM:主要用于存放操作系统以及运行环境(Runtime Environment),如 JAVA 虚拟机、Applet 等。

8 KB EEPROM:用于储存我们开发并装载至 JAVA 卡上的Applet。

8-bit processor: JAVA 卡需要至少8位的处理器支持。

那么 JAVA 卡的内部结构究竟是怎么样的呢?根据上述的硬件介绍,基本上我们可以将 JAVA 卡想像为一部 PC 的缩影:JAVA 卡的内部结构由 OS、native functions、JAVA VM(JAVA 虚拟机)、JAVA Framework 以及架构在此上的应用程序(Applet)所构成。下图即为 JAVA 卡内部结构:
在此结构中,最底层的 OS(操作系统) and Native Functions(基本函数)是负责低层的处理工作,如同 PC 的操作系统。

JAVA 虚拟机处于OS and Native Functions 之上,它的存在实现了卡接口的统一和编程语言的统一。并且也隐藏了卡底层各个卡供应商不同的技术。

JAVA 卡 Framework 为开发人员定义了一整套编程接口类,主要负责执行 JAVA 卡 Applet 以及提供 Applet 执行所需要的环境。

Industry Add-on Classes 则是服务方所提供的类,使得企业与公司能够提供属于自己的服务程序,例如,如果这张卡是 GSM 网络的 SIM 卡,那么这一层就是 SIM 卡所需的接口类。

JAVA 卡的最上层就是所谓的 JAVA 卡 Applet,也就是我们要进行开发的应用。如图所示,一个 JAVA 卡可以执行多个 JAVA 卡 Applet。每个 Applet 是靠 AID (应用ID号)来识别的。但是要特别注意,JAVA 卡的执行环境并不支援多线程,所以一次只能执行一个 Applet,并且 Applet 与 Applet 之间也有防火墙的阻隔。

JAVA卡的生命期

JAVA 卡的生命期

当 JAVA 卡的 OS,虚拟机,编程接口(API)类库装载到卡的 ROM 之后,JAVA 卡即开始了它的工作使命。这个把 JAVA 卡的固定不变的组件放入芯片的不可重写区域(ROM)的过程叫掩膜(MASK)。不过,要使 JAVA 卡真正能使用还要两个必须的过程:初始化和个人化。初始化是指:在卡体内(一般在 EEPROM 中)创建文件结构。这个文件结构是大家都有的,它的具体内容是与你这张 JAVA 卡的功能有关。比如:你的卡是银行卡,那么卡内结构就是由银行业规定的结构;如卡是 SIM 卡,那么卡的结构就要根据 GSM 规范来定。初始化并没有涉及到个人信息。如果卡要发行给指定的某个人,就要通过个人化过程来完成。个人化就是把个人信息附于卡。它可以是物理过程,如打印某人的照片;也可以是电子过程:把个人信息写入卡中。如你的 ID 号,PIN 码等等。初始化和个人化可以由制卡商或发行商来完成。当初始化和个人化完成后,这张 JAVA 卡就可以被使用了。你可以把卡插入读卡器,对它发出 APDU 指令,或下载更多的 Applet。JAVA卡的生命期将一直持续到它被物理损害,被不正确的操作锁死或卡的应用过期。

JAVA 卡虚拟机的生命期
    与 PC 中的 JAVA 虚拟机不同,JAVA 卡中的虚拟机将永远运行。那怕掉电后,卡上的信息也将被保存下来。所以 JAVA 卡虚拟机的生命期是与 JAVA 卡生命期一致的。当没有电源时,虚拟机就象在一个无限大的时钟频率下运行。

JAVA 卡 Applet 的生命期
    Applet 开始于 Applet 被安装并在卡的注册表中注册终止于 Applet 被从注册表中注销。一般 Applet 在卡中是没有被激活的,只有当这个 Applet 被终端“选择”(Select)到时,Applet 才被激活。

JAVA卡的JAVA语言

JAVA 卡的程序当然是由 JAVA 语言写的。也是由一般的 JAVA 编译器编译的。但由于 JAVA 卡硬件限制(内存大小,CPU 的能力),JAVA 卡并不支持所有的 JAVA 语言的特性。以下的 JAVA 语言特性,JAVA 卡是不支持的:

动态类装载(Dynamic class loading)

安全管理(Security manager)

对象克隆(Object cloning)

finalize()方法

一些数据类型:float,double,long,char

多线程

而这些关键字也不被支持:native,synchronized,transient,volatile。同时几乎所有的 JAVA 核心 API 的类都不被 JAVA 卡支持,只有一些从 JAVA.lang package 来的类才被支持。
JAVA 语言其他的特性,JAVA 卡都支持。有关 JAVA 卡 JAVA 语言详细资料,请参阅 JAVA Card 2.1.1 Virtual Machine Specification.

JAVA卡的API

根据 JAVA 卡 2.1 的规范规定(JAVA Card 2.1.1 Application Programming Interface),目前 JAVA 卡共支持 4 个 Packages (包),现就其中一些重要的类进行介绍:

java.lang package:提供 JAVA 语言一些重要的类,如 Object 类,因为所有的 JAVA 类皆继承它。

Object – class(说明它的类型为class类,若写interface,说明类型为接口,以下相同),所有类的基类

Throwable – class, 为所有 error 及 exception 的父类,这表示 JAVA 卡也支持 exception

javacard.framework package :是 JAVA 卡 API 主要的核心 package,提供并实现了 JAVA 卡 Applet 基本的接口与工具。

AID – class,用来唯一表示 JAVA 卡 Applet 的 ID 号

APDU – class,通过一个 byte 数组缓冲来接收与传送终端的指令与回传 Applet 执行的结果与状态的标准格式。这一过程与我们在上一篇文章介绍的APDU是完全一样的。我们在进行 Applet 开发时,可以想象 APDU 是一个卡与终端通信的缓冲区,终端和卡都把信息放入这一缓冲进行通信。

Applet – class,每一个 JAVA 卡的 Applet 都必须继承此类。其中在实现时要特别注意几个方法,如 select()、 deselect() 是终端根据 Applet 的 AID 下达选择或不选择。而 install()与register() 则是 Applet 装载至 JAVA 卡上,并向 JAVA 卡注册表进行注册的方法 。等到 Applet 安装注册完成,并且被终端所选择时,所有下达的 APDU 命令都会交由 Applet 的 process() 方法来处理并负责回传结果。

IOS7816 – interface,提供了 ISO7816 所使用的常数值

PIN – interface, 使其子类通过实现此接口完成验证 PIN 码的功能

Shareable – interface,使得不同的 Applet 能够通过实现此接口来达到互相沟通的功能

JCSystem – class,负责管理 Applet 与 JAVA 卡的系统资源,如 AID 与 Transaction 的管理。

OwnerPIN – class,继承自 PIN interface,负责维护卡片持有人的 PIN 码,并提供相关 check() 与 update() 等方法。

Util – class,一个提供常用工具的类 ,如 byte 数组拷贝与比较等功能。

javacard.security package:提供安全机制的包,其中几个重要的 interface(接口)与class(类) 如下:

Key – interface,是 DESKey、 PrivateKey、 PublicKey等接口的共同接口

KeyBuilder – class,创建各种安全的 key 的工厂(factory)

MessageDigest – class,可以将信息做数字签名的对象

javacardx.crypto package:其中包含了关于加密与安全的对象,而此 package 仅包含了一个接口与一个类:

Cipher – class ,使得在 JAVA 卡中的信息得以加密保护

以上只是简单的介绍了一下 JAVA 卡 API 的接口,我们将通过一些例子进行详细介绍,当然最完整的资料和解答还得参考: JAVA Card 2.1.1 Application Programming Interface规范。

Applet 的简单例子

 
    以下我们介绍一个极为简单的 Applet 的例子,通过对它的介绍,我们将初步了解 Applet 的组成结构,和一些必须实现的方法(构造函数,install()方法,register()方法,select()方法,process()方法)。这个例子完成的功能是:当读卡器对 JAVA 卡发送取随机数的APDU(00 84 00 00 04)指令时,JAVA 卡会返回4个字节的16进制随机数的响应。
package Random;

import javacard.framework.Applet;

import javacard.framework.ISO7816;

import javacard.framework.ISOException;

import javacard.framework.APDU;

import javacard.framework.JCSystem;

import javacard.framework.Util;

import javacard.security.*;

import javacardx.crypto.*;

/**

 * @author Administrator

 *

 */

public class Random extends Applet {

/* 定义用到的常量 */

//CLA

final static byte CLA_Getchallenge = (byte)0x00;

//INS

final static byte INS_Getchalleng = (byte)0x84;

/* 定义变量 */

RandomData Random;

/* 安装applet */

public static void install(byte[] bArray, short bOffset, byte bLength) {

// GP-compliant JavaCard applet registration

new Random().register(bArray, (short) (bOffset + ), 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) INS_Getchalleng:

byte LE = buf[ISO7816.OFFSET_LC];

    byte[] RandomBuffer = new byte[LE];

    short ROffset = (short);

    short Len = (short)LE;

    RandomBuffer = JCSystem.makeTransientByteArray( Len,

  JCSystem.CLEAR_ON_DESELECT);

    Random = RandomData.getInstance(RandomData.ALG_SECURE_RANDOM);

    Random.generateData(RandomBuffer,ROffset,Len);

    Util.arrayCopyNonAtomic(RandomBuffer,(short),buf,(short),Len);

    apdu.setOutgoingAndSend((short),Len);

break;

default:

// good practice: If you don't know the INStruction, say so:

ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);

}

}

}
 

PBOC规范下的java卡介绍的更多相关文章

  1. Android下HelloWorld项目的R.java文件介绍

    R.java文件介绍 HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R {     public s ...

  2. PBOC规范研究

    一.ISO14443协议和PBOC关于CID的约定 看过协议的人其实都明白,RATS命令中参数字节的低半字节是CID,期中,CID不能为15. ISO14443协议中要求当RATS命令的CID等于0时 ...

  3. PBOC规范(2.0->3.0)对照表

    1    数据方面 TAG                                               PBOC2.0                                 ...

  4. 深入Java虚拟机读书笔记第一章Java体系结构介绍

    第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...

  5. Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试【转】

    Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试[转] 本文是本人前一段时间做一个简单Java监控工具调研总 ...

  6. java复习1 java简单介绍

    在学校的时候.学JAVA学的模棱两可,半知半解.工作以后给我带来了非常大的困扰,所以我须要在学一遍.如今就開始吧... . java[1]是一种能够撰写跨平台应用软件的面向对象的程序设计语言,是由Su ...

  7. Net平台下的消息队列介绍

    Net平台下的消息队列介绍   本系列主要记录最近学习消息队列的一些心得体会,打算形成一个系列文档.开篇主要介绍一下.Net平台下一些主流的消息队列框架.       RabbitMQ:http:// ...

  8. (转)Memcached 在windows下的java使用

    Memcached 在windows下的java使用   研究这个东东主要是为了解决在教务管理中选课系统的大并发情况下数据库频繁读写造成速度慢的问题,但要使用WEB服务器的内存,是不是可靠还需要验证, ...

  9. centos7下将java -jar命令运行一个项目做成systemd服务

    有些时候运行一个java项目在linux下通过一条简单的java命令即可,如: #nohup java -jar jenkins.war & ###这里为后台运行jenkins 在此背景下,j ...

随机推荐

  1. 解决error C2011: 'fd_set' : 'struct' type redefinition的方法

    http://www.cnblogs.com/ark-zhang/archive/2013/06/19/3144383.html   首先说明这个问题由于重复定义引起的编译错误. 先说明解决方法,然后 ...

  2. Backup App's data without rooting the phone

    First I'd like to let you know that my phone is Android 6.0 Marshmallow. So it works on the latest A ...

  3. PowerDesigner生成Oracle数据字典

    PowerDesigner版本信息 1.File-->NewModel... 2.选择模型 New Model Model types-->Physical Data Model --&g ...

  4. thinkphp验证码点击更换js实现

    <img src="__CONTROLLER__/verify" alt="" onclick=this.src="__CONTROLLER__ ...

  5. 鼠标HOVER时区块动画旋转变色的CSS3样式掩码

    鼠标hover时区块动画旋转变色的css3样式掩码<!DOCTYPE html> <html> <head> <meta charset="utf- ...

  6. ASP.NET中Button控件的CommandName和CommandArgument属性用法

    在Repeater中的使用: <asp:Repeater ID="rptActionList" runat="server" OnItemCommand= ...

  7. css3 文本效果

    CSS3 文本效果   1 CSS3 文本阴影在 CSS3 中,text-shadow 可向文本应用阴影,能够规定水平阴影.垂直阴影.模糊距离,以及阴影的颜色.text-shadow: 5px 5px ...

  8. Web serviser请求通道在等待 00:00:59.6479648 以后答复时超时。增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能是更长超时的一部分。

    可以把sendTimeout调长一点试试 .net webService 中: 设置这些参数,延长连接时间, closeTimeout="00:10:00" openTimeout ...

  9. tomcat学习笔记1

    tomcat是一个开源软件,是由java语言编写的,它工作的话需要运行在jvm虚拟机中,说到jvm不得不说下java这个大名鼎鼎的编程 语言了 java这个编程语言最优秀的特点要数write once ...

  10. php或js判断网站访问者来自手机或者pc

    php或js判断网站访问者来自手机或者pc机 2013年9月26日,在弄wtuonline的时候为了区分用户是来自手机版浏览器还是pc,针对不同平台选择不同的网站版本,最终总结如下:         ...