- 浏览: 270761 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (251)
- 面试基础 (9)
- java基础 (40)
- 调试配置 (10)
- 转载文章 (4)
- 心灵鸡汤 (8)
- java工具 (6)
- CSS学习 (7)
- css案例 (2)
- 经济 (1)
- 小节惹的祸 (1)
- 实例心得 (21)
- 数据库 (7)
- 有用的代码 (17)
- Struts (3)
- Hibernate (5)
- Spring (3)
- java xml (7)
- Java Reflection API (1)
- 网络配置 (4)
- SSH (8)
- java开源框架 (13)
- ajax (4)
- swing (1)
- 设计模式 (1)
- 未主流组件 (7)
- WebService (6)
- 20111019 (1)
- xiao清讲课笔笔~~~UML (0)
- 笔记 (2)
- SOAP (9)
- 第一天遇到的问题 (1)
- Java Card (3)
- 面试 (18)
- Java (17)
- JNLP 集群 (0)
- java 面试 (3)
最新评论
-
ap0406708:
138XXXXXXXX
webserivce spring-ws 安全 -
yezhuzhe:
...
[code]SSH上传下载 ------温故知新 -
thinking_ou:
怎么需要解压密码
webserivce spring-ws 安全 -
ap0406708:
uuu999ggg 写道连return都写错了
try catch finally 块 与 函数的return -
wst0350:
...
java正则表达式,js正则表达式
了解Java Card体系结构 API和运行 环境的内部工作原理
http://www.cn-java.com/www1/?action-viewnews-itemid-363
摘要
作者:Zhiqun Chen,Rinaldo Di Giorgio专稿
本文中凡提到Java Card时均指Java Card 2.0。
什么是智能卡?
所有智能卡都包括三类存储器:
国际标准组织规定的ISO 7816第1-7部分包括覆盖智能卡各个方面的一组标准。ISO 7816包括:
- 物理特性(第1部分)
- 尺寸和触点位置(第2部分)
- 电子信号和传输协议(第3部分)
- 行业间交换指令(第4部分)
- 应用程序标识符(第5部分)
- 行业间数据元素(第6部分)
- 行业间SCQL指令(第7部分)
下图表示智能卡的物理特性,在ISO 7816第1部分中有规定。
Physical Characteristics ---物理特性
Magnetic Stripe ( Back of card ) ---磁条(卡的背面)
Contacts ---触点
Embossing area --- 刻字区
Front of Card ---卡的正面
有关ISO 7816和智能卡的详细情况,请参见"智能卡:入门"。
一般的说,智能卡不包括电源,显示屏,或键盘。它通过其8个触点,利用串行通信接口与外部世界交互。ISO 7816第2部分对智能卡的尺寸和触点位置有详细规定。下图表示智能卡的触点。
Eight Contact Points --- 8个触点
Power Supplier ---电源
Reset ---复位
Check ---检查
Ground ---接地
Optional Contact ---可选触点
Input/Output ---输入/输出
Optional Contacts ---可选触点
命令APDU | ||||||
标题头(必须) | 主体(可选) | |||||
CLA | INS | P1 | P2 | Lc | 数据字段 | Le |
标题 头对被选指令进行编码。它包括4个字段:类(CLA)、指令(INS)、和参数1和2 (P1和P2)。每个字段包含一个字节:
- CLA:类字节。在很多智能卡上,这个字节用来表示应用程序。
- INS:指令字节。这个字节表示指令代码。
- P1-P2:参数字节。这些字节对 命令APDU提供进一步说明。
Lc表示 命令APDU的数据字段的字节数;Le表示以下 应答APDU 的数据字段希望的字节数。
应答APDU | ||
主体(可选) | 尾部(必须) | |
数据字段 | SW1 | SW2 |
状态 字节 SW1和SW2表示 命令APDU在智能卡中的处理状态。
什么是Java Card?
Java Card上的系统体系结构如下 页图所示。 其中:
Applet ---小应用程序
Industry Add on Classes ---企业添加类
javacard Framework --- Javacard框架
OS & Native Functions ---操作系统和本地功能
如 图所示,Java Card虚拟机是建立在特定集成电路(IC)和本机操作系统执行程序上的。JVM层利用一般语言和系统接口隐藏了制造商的专利技术。Java Card框架定义了一系列用来开发Java Card应用程序和为这些应用程序提供系统服务的应用程编程接口(API)。某特定 行业或特殊的商务应用可提供添加的库,以提供服务或优化安全性和系统模型。Java Card应用程序 称为applets。一个卡上可驻留多个applets。每个applets均被其AID (应用程序标识符)唯一标识,如ISO 7816第5部分的规定。
Java Card的 生命周期
Java Card虚拟机的 生命周期
Java Card applet和对象的 生命周期
ava Card 2.0语言子集
- 动态类装载
- 安全管理器
- 线程和同步
- 对象复制
- 对象回收(finalization)
- 长基本数据类型( float、double、long、和char )
Java Card 2.0框架
Java Card框架包括4个包:
包名 | 说明 |
javacard.framework | 这是JavaCard的内核包。它定义诸如applet和个人身份代码(PIN)等类,这些类是Java Card程序和APDU、系统和Util (为Java Card程序、APDU提供运行时 服务和系统服务等,如APDU处理和对象共享等)的基本构件。 |
javacardx.framework | 这个包可为与ISO 7816-4兼容的文件系统提供面向对象的设计。它支持ISO 7816规定的基本文件(EF)、专用文件(DF)和面向文件的APDU。 |
javacardx.crypto和javacardx.cryptoEnc | 这两个包支持智能卡所要求的密码功能。 |
Java Cardx包符合Java命名原则,是Java Card框架的延伸。您 并非 必须在智能卡上支持这些包。
Java Card安全性
Java Card内部工作原理
怎样编写Java Card小应用程序?
这个例子被制作成两栏的格式:左栏包括Java代码及Java风格的注解;右栏提供对左栏 代码的详尽解释。
package bank.purse | Java Card与标准Java一样也支持包和标识符名称惯例 |
import javacard.framework.* ; import javacardx.framework.* ; |
|
public class Wallet extends Applet { /* constants declaration */ |
一个applet是 javacard.framework.Applet 的继成类的实例 |
// code of CLA byte in the command APDU header final static byte Wallet_CLA = (byte)0xB0; | CLA标识该应用程序 |
// code of INS byte in the command APDU header final static byte Deposit = (byte)0x10; final static byte Debit = (byte)0x20; final static byte Balance = (byte)0x30; final static byte Validate = (byte)0x40; |
INS标识应用程序指令 |
// maximum number of incorrect tries before the PIN is blocked final static byte PinTryLimit = (byte)0x03; // maximum size PIN final static byte MaxPinSize = (byte)0x04; |
PIN对象参数 |
// status word (SW1-SW2) to signal that the balance become neagtive; final static short SW_NEGATIVE_BALANCE = (short)0x6910; |
Applet特定静态字 |
/* instance variables declaration */ OwnerPIN pin; byte balance; byte buffer[ ]; // APDU buffer |
|
private Wallet( ) { // It is good programming practice to allocate // all the memory that an applet need during its // lifetime inside the constructor pin = new OwnerPIN(PinTryLimit, MaxPinSize); balance = 0; register( ); } // end of the constructor |
private构造 方法---类Wallet的实例由其install方法 实例化 applet 通过调用Applet类中所定义的register 方法向JCRE登记注册。现在 对外部 而言,applet 是可见的。 |
public static void install(APDU apdu) { // create a Wallet applet instance new Wallet( ); } // end of install method |
在applet安装过程的最后一步,方法install被JCRE调用 |
public boolean select( ) { |
// returns true to JCRE to indicate that the applet // is ready to accept incoming APDUs . return true; } // end of select method |
这个方法被JCRE调用,表示该applet已被选择。它执行处理以下APDU信息所需要的必要初始化 |
public void process(APDU apdu) { // APDU object carries a byte array (buffer) to // transfer incoming and outgoing APDU header // and data bytes between card and CAD buffer = apdu.getBuffer( ); |
在applet被成功选择之后,JCRE向此方法发送进入的APDU。 APDU对象被JCRE拥有和维护。它封装了底层的基本传输协议 (如ISO7816-3规定的T0或T1 )的细节并提供了通用接口。 |
// verify that if the applet can accept this // APDU message if(buffer[ISO.OFFSET_CLA] !== Wallet_CLA) ISOException.throwIt (ISO.SW_CLA_NOT_SUPPORTED); |
当发生错误时,applet可能决定中止过程,并抛出一个包含状态字(SW1 SW2)的例外,状态字用于表示卡的处理状态。 |
switch (buffer[ISO.OFFSET_INS]) { case Balance: getBalance(apdu); return; case Debit: debit(apdu); return; case Deposit: deposit(apdu); return; case Validate: validate(apdu); return; default: ISOException.throwIt (ISO.SW_INS_NOT_SUPPORTED); } } // end of process method |
process方法的主要功能是执行APDU规定的动作,并向终端返回正确的响应。 INS字节 指定需要执行的动作的类型 |
private void deposit(APDU apdu) { // access authentication if( ! pin.isValidated( ) ) ISOException.throwIt( ISO.SW_PIN_REQUIRED); // Lc byte denotes the number of bytes in the data // field of the command APDU byte numBytes = (byte) (buffer[ISO.OFFSET_LC]); // indicate that this APDU has incoming data and // receive data sharing from the offset // ISO.OFFSET_CDATA byte byteRead = (byte) (apdu.setIncomingAndReceive( ) ); // It is an error if the number of data bytes read does // not match the number in Lc byte if(byteRead != 1) ISOException.throwIt(ISO.SW_WRONG_LENGTH); // increase the balance by amount specified in the // data field of the command APDU balance = (byte) (balance + buffer[ISO.OFFSET_CDATA]); // return successfully return; } // end of deposit method |
参数APDU对象包含一个数据字段,它 指定 存款的金额。 在从JCRE接收到APDU对象后,APDU缓冲器中有前5个字节(CLA、INS、P1、P2、Lc/Le )可用。其在APDU缓冲器中的偏移量在类ISO中规定。因为数据字段是可选的,所以applet需要 显式通知JCRE 获取额外 的数据字节。 卡与CAD之间的通信是在命令APDU和应答APDU对之间交换的。在存钱( deposit ) 例子中, 应答APDU不包含数据字段。JCRE使用状态字0×9000 (正常处理)构成正确的应答APDU。applet开发人员不必关心构造正确的 应答APDU的细节。 当JCRE捕捉到一个exception (表示在处理指令时有错误)时,JCRE会使用Exception中包含的状态字构造 应答APDU 。 |
private void debit(APDU apdu) { // access authentication if( ! pin.isValidated( ) ) ISOException.throwIt(ISO.SW_PIN_REQUIRED); byte numBytes = (byte) (buffer[ISO.OFFSET_LC]); byte byteRead = (byte) (apdu.setIncomingAndReceive( ) ); if(byteRead != 1) ISOException.throwIt(ISO.SW_WRONG_LENGTH); // balance can not be negative if(balance - buffer[ISO.OFFSET_CDATA]) <0) ISOException.throwIt(SW_NEGATIVE_BALANCE); balance = (byte) (balance - buffer[ISO.OFFSET_CDATA]); } // end of debit method |
在debit方法中,APDU对象包含一个数据字段, 该数据字段 指定了提款的金额。 |
private void getBalance(APDU apdu) { // access authentication if(! Pin.isValidated( ) ) ISOException.throwIt(ISO.SW_PIN_REQUIRED); // inform system that the applet has finished processing // the command and the system should now prepare to // construct a response APDU which contains data field apdu.setOutgoing( ); // indicate the number of bytes in the data field apdu.setOutgoingLength(byte)1); // move the data into the APDU buffer starting at offset 0 buffer[0] = balance; // send 1 byte of data at offset 0 in the APDU buffer } // end of getBalance method |
getBalance在 应答APDU的数据字段中返回钱包的余额。 因为应答APDU响应中的数据字段是可选的,所以applet 需要 显式 告诉JCRE 它要返回的数据。JCRE使用APDU对象缓冲器内的数组和正确的状态字构造一个完整的 应答APDU 。 |
private void validate(APDU apdu) { // retrieve the PIN data which requires to be validated // the user interface data is stored in the data field of the APDU byte byteRead = (byte) (apdu.setIncomingAnd Receive( ) ); // validate user interface and set the validation falg in the user interface // object to be true if the validation succeeds. // if user interface validation fails, PinException would be // thrown from pin.check( ) method pin.check(buffer, ISO.OFFSET_CDATA, byteRead); } // end of validate method } // end of class Wallet |
PIN是智能卡常用的保护数据免遭越权使用的方法。 PIN中记录自上次正确的PIN确认后不成功的尝试次数。如果不成功的尝试次数超过PIN规定的允许最大尝试次数,则卡就被闭锁。 在成功选择applet后,首先必须使PIN生效,然后才能在applet上执行其它指令。 |
结论
参考资料
- 有关智能卡Java Developer系列文章的第一篇文章是"智能卡入门"
http://www.javaworld.com/jw-12-1997/jw-12-javadev.html
- 有关与Java Card相关的商业机会,请参见"把货币交给Java Card API "
http://www.javaworld.com/javaworld/jw-02-1998/jw-02-javacard.html
- 有关在Java Card 1.0 API上开发应用程序的方法,请参见" Java Card速成"
http: //www.javaworld.com/javaworld/jw-02-1998/jw-02-javadev.html
- Java Card站点JavaSoft
http://www.sun.com/products/javacard/
- Java商业站点
http://java.sun.com/products/commerce/
- Javasoft部的Java Card技术总监Joshua Susser对本文进行了审阅并提供了技术指导,谨在此向他表示衷心感谢。
作者简介
http://www.blogjava.net/crespochen/archive/2011/05/19/350607.html
四、Java Card硬体需求 |
Java Card有如一部具体而微的电脑,其硬体的规格主要是在於维护Java Card runtime environment的 求,其最小的规格要求为:
- 512 bytes RAM:主要用於存放程式执行时的 stack、暂存资料以及做为I/O的缓冲区。
- 24 KB ROM :主要用於存放系统的程式以及 Runtime Environment,如 JVM、applets、 native functions 等。
- 8 KB EEPROM:用於储存我们所下载至 Java Card的 applets,并且做为 object heap存放之处。
- 8-bit processor: Java Card必须至少支援8位元的处理器。
五、Java Card软体架构 |
在上述的硬体架构中,基本上我们可以将Java Card想像为一部PC的缩影,而Java Card的软体架构则具有OS、 native functions 、JCRE(Java Card Runtime Environment)以及架构在此JCRE上的应用程式(Java Card applets),事实上Java Card的软体架构也是与今日的软体架构相仿,图5-1即为Java Card之软体架构。
图5-1 Java Card之软体架构图 |
在此软体架构中,最底层的OS and Native Functions 是负责低阶的处理工作,如同今日的作业系统。而在上面两层Java Card Interpreter与Java Card APIs and Framework就是我们所谓的JCRE,主要负责执行Java Card applets以及提供 applet执行所 要的环境。而 Industry Add-on Classes则是 service provider 所提供的classes,使得企业与公司能够提供属於自己的服务程式。
Java Card的最上层就是所谓的Java Card applets,就如图5-1所示,一个 Java Card可以执行多个Java Card applets,但是要特别注意,Java Card 的执行环境并无支援Multi-thread,所以一次只能执行一个applet,并且 applet与applet之间也有firewall的阻隔。尽管如此,在Java Card的设计之中亦有让不同的 applets相互沟通的机制,我们只 要让applet implement javacard.framewor k.Shareable interface就能够分享applet 的 resource。
因为受限於体积与 resource,所以 Java Card在执行环境上的支援是相当有限的,表5-1即 Java Card执行环境的支援现况,其他详细内容请参考 references。
相关推荐
关于Java Card v2.2.1 API制作的chm文档
javacard 运行环境 eclipse 已经配置
javacard开发环境 Eclipse 配置完成 安装了jdk后可以直接开发
jcre,api,gp card 等中文规范,网上资源非常至少。希望对学习智能卡的同学有帮助!
JavaCard API
压缩包里面有8份关于智能卡系统,也就是JavaCard Cos的文档资料,pdf和ppt的形式。有JavaCard API的,JavaCard Cos原理讲解的,有JavaCard Applet开发的等等。
javaCard开发环境配置 利用eclipse进行javacard的开发
JAVA CARD 3.0.4 规范,JAVA CARD 开发用得到的
javacard applet 开发实例 正常运行 带jar包 package mifare; import com.ibm.jz.JZSystem; import javacard.framework.APDU; import javacard.framework.Applet; import javacard.framework.ISO7816; import ...
配置完成的javacard开发环境,基于Eclipse
配置完成的Eclipse环境,可以开发java卡,javacard jcop nxp 环境配置完成,测试可运行
java card开发规范,中文版本,包括GP规范、java虚拟机、java卡API、java运行环境,适合初学者学习。
javacard3.0.1虚拟机规范classic版本。
目前常见的智能IC卡运行着JavaCard虚拟机,智能IC卡上可以运行由精简后的Java语言编写的卡应用(简称Applet)。智能IC卡的Applet不能自己启动,必须由外部终端(例如POS机,地铁刷卡终端等)向卡片发送Select命令,...
Java 卡技术体系结构与程序员指南,对于Applet 程序是一份比较深入的、难得的参考资料;对于Java 卡开发者来说,也有一定的启示
关于Java Card相关基本知识,Java Card技术相关原理,具体包含了JavaCard的接口和开发过程。
Hello JavaCard源码,非常简单JavaCard入门工程
Java Card 技术提供了一个 Java 虚拟机(JVM)和运行时环境,允许开发者创建安全的智能卡应用程序。 Java Card 技术的特点: * 高度安全性:Java Card 技术提供了高度安全的存储和处理,保护用户的敏感信息。 * ...
oracle最新的3.04javacard规范
JAVA CARD 开发宝典 对APDU JAVACARD iso7816 iso14443 都有讲述