PBOC规范下的java卡介绍

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 + 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) INS_Getchalleng:

byte LE = buf[ISO7816.OFFSET_LC];

    byte[] RandomBuffer = new byte[LE];

    short ROffset = (short)0;

    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)0,buf,(short)0,Len);

    apdu.setOutgoingAndSend((short)0,Len);

break;

default:

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

ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);

}

}

}
时间: 2024-10-11 01:35:18

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

Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试

本文是本人前一段时间做一个简单Java监控工具调研总结,主要包括VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,以及对Java微基准测试的简单介绍,总结下来比较推荐,Visualvm,Perfino,yourkit和Jprofiler(推荐值按顺序依次递减),其它工具不太推荐使用.下面是文章目录结构:  一.VisualVm  1.简介 2 2.安装插件并启动VisualVM 2 3.内存分析 3 4.CPU分析 5 5.线程分析 6 6.连接

Linux下搭建Java环境变量并实现第一个Java小程序

1.首先,我们打开虚拟机里面的Linux操作系统,然后点击下图菜单下的虚拟机选项: 在点击虚拟机下的设置菜单,如下图所示: 这里我已经添加进去我所需要的文件夹了,我放在本机E盘下的as文件夹里面到底放了什么呢? 上图这两个压缩文件,一个是android studio的压缩包,上年发布出来的,一直没用它,今天本来想在windows下安装这个软件,发现所需要的jdk是1.7,而我在windows下的jdk版本为1.6,所以打算在Linux操作系统下安装jdk1.7,并安装andoid studio工

linux下配置Java和Go环境

重新安装了limux系统,由于长时间没有配置过java环境和Go环境,竟然不知道了都需要哪些东西了,因此就在博客里面总结一下,以免再次忘记,我都配置在/etc/profile文件里面,以前用Ubuntu时,配置在.bash_profile文件中,进不去图形界面,只好配置在/etc/profile文件中: 首先配置java环境: export JAVA_HOME=/usr/local/jdk1.7.0_65 export PATH=.:$JAVA_HOME/bin:$JAVA_HOME/jre/b

Java注解介绍

原文链接: Java Annotations: An Introduction原文日期: 2005年10月14日翻译日期: 2014年07月20日翻译人员: 铁锚 翻译完后,感觉这篇文章是不是在http://www.developer.com被挖坟了? Java注解介绍 基于注解(Annotation-based)的Java开发无疑是最新的开发趋势.[译者注: 这是05年的文章,在2014年,毫无疑问,多人合作的开发,使用注解变成很好的合作方式,相互之间的影响和耦合可以很低]. 基于注解的开发将

Mac OS X 下搭建 Java 开发环境图解

本篇博客介绍如何在Mac osx系统下搭建java开发环境,有了java的开发环境,我们就可以做Java相关的开发,Eclipse和Android Studio都是要有JVM环境才能运行的,所以本篇就稍微总结一下如何在Mac osx下配置java环境变量. 先来看看笔者的电脑配置: 打开终端,查看10.10版本的系统使用的是什么shell命令: 输出的是bash,说明是Bourne shell,是默认的Unix Shell命令. 下面通过命令行查看笔者的java版本: 如果你的系统已经安装成功J

windows下,java环境变量的设置,设置点击startup.bat启动tomcat

1.首先,安装好java jdk以后设置环境变量: CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar JAVA_HOME:C:\Program Files\Java\jdk1.7.0_51 Path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin 这个我觉得就不用详细介绍了,基础. 2.其次下载好的tomcat解压在F盘,名字为:apache-tomcat-proxy 在原来配置好的变量上再修改: C

M1卡介绍

对于电脑周边编程,主要有两种思路 一.利用windows系统本身dll库. 二.利用硬件产家提供的dll. 本篇对M1卡的编程是利用上述第二种方法. M1卡最为重要的优点是可读可写并且安全性高的多功能卡.这些优点与其自身的结构密不可分. M1结构: M1卡分为16个扇区,每个扇区4块(块0-3),共64块,按块号编址为0-63.第0扇区的块0(即绝对地址0块)用于存放厂商代码,已经固化,不可更改.其他各扇区的块0.块1.块2为数据块,用于存贮数据:块3为控制块,存放密码A.存取控制.密码B.每个

如何在Mac OS系统下搭建Java开发环境图解

似乎有很久都没有写博客了,有工作的一些原因,也有个人的一些原因,今天刚好下雨,也没有地方可去,于是就窝在家里倒腾了下,本篇文章主要是简单介绍一下如何在Mac OS系统下搭建java的开发环境,做java开发工作,当然首先是得有一个java环境,所以接下来主要是简单介绍一下Mac环境下java环境变量的一些配置工作. 鄙人的电脑配置: 打开终端,查看10.9.5版本的系统用的是什么shell命令: 大家可以看到,控制台输出地bash,说明系统用的是Bourbe shell,是默认的Unix She

LINUX下搭建JAVA的开发环境

LINUX下搭建JAVA的开发环境 (2009-07-13 10:04:13) 下面就将Linux下JAVA开发环境的搭建详细道来: 1.Linux下JDK的安装 至于下载JDK的二进制可执行文件,这里就不讲了,大家直接到官方网去下载就可以了. (1)我下载下来的JDK安装文件名称为:jdk-1_5_0_14-linux-i586-rpm.bin,我把它保存在/tools目录下. (2)打开一个终端,依次输入以下命令: # cd /tools                    进入JDK安装