- 浏览: 278504 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (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卡技术体系结构与程序员指南 #### 一、引言 随着信息技术的快速发展,智能卡作为一项重要的安全技术,在金融、身份验证等多个领域发挥着关键作用。Java卡技术作为一种在智能卡上运行Java应用程序的技术,...
软件架构上,Card OS和Native Functions负责底层处理,Java Card VM统一芯片接口,Java Card Framework提供API供开发者创建Applet,共同构成JCRE(Java Card运行时环境)。 二、Java芯片应用的开发 开发Java芯片...
Card OS、Java Card VM和Java Card Framework共同构成JCRE,为Java芯片的运行提供了完整的环境。 **二、Java芯片应用的开发** 开发Java芯片应用通常涉及Applet编写,Applet是基于Java Card API的小型程序,它们由...
对于开发者而言,了解JVM的工作原理和优化技巧,能有效提升代码的运行效率。 本书共分为五个部分: 第一部分“走进Java”,介绍了Java技术的演进历程和主要组件。Java程序的性能提升得益于其热点代码检测和运行时...
Java卡,也称为Java Card,是一种在小型、安全的嵌入式设备上运行Java应用程序的技术,常用于SIM卡、银行卡和其他类型的智能卡片中。这些卡片通常具有有限的内存和处理能力,但能够提供高度的安全性和可移植性。 1....
3. **JCOP与GP体系结构**:Java Card通常在JCOP(Java Card Operating System)上运行,这是一个由硬件制造商提供的操作系统。Global Platform(GP)是一个开放标准,用于管理和控制Java Card上的安全组件。理解这两...
- **JavaCard API**:将Java带入了智能卡领域,开启了全新的应用可能。 #### Java基础程序设计 Java基础程序设计涵盖了从语言简介、简单程序编写到高级概念的逐步学习路径: - **Java语言介绍**:理解Java的基本...
Java卡是基于Java技术的智能卡,其运行环境称为Java Card平台。这个平台由Java Card虚拟机(JVM)、操作系统和一系列的应用程序接口(API)组成,允许开发者编写小型的、安全的、跨平台的应用程序,即Applet。这些...
4. **JavaCard**:用于智能卡和其他嵌入式设备,提供安全的Java运行环境。 Java 技术的核心组成部分包括: - **Java编程语言**:定义了变量、表达式、控制结构等基本语法,以简洁、面向对象的方式编写代码。 - **...
规范定义了卡片的体系结构,包括安全域(Security Domains)、全局服务应用(Global Services Applications)、运行时环境(Runtime Environment)、可信框架(Trusted Framework)、GlobalPlatform环境(OPEN)、...
3. 通用和开放:Java卡不但兼容了现有的智能卡行业标准,它还提供了一整套标准的API,使智能卡应用开发回到主流的面向对象编程,开发人员无需了解复杂的智能卡硬件和专用技术; 4. 安全:Java卡继承了Java语言的安全...
- **1996年12月**:继续扩展Java生态,包括更多公司加入Java许可证持有者行列,以及发布了JavaCard API规范,旨在将Java能力引入全球的智能卡中。 #### 二、Java基础知识 - **Java语言介绍** - Java是一种面向...
Sun公司还宣布了Java Card API规范,这是智能卡使用的第一个开放API。Java Card规范的发布意味着Java技术将能够被应用于全世界亿万张智能卡中,极大地拓宽了Java的应用前景。 从Java的历史可以看出,Java最初是为了...
- **JRE**包含了JVM以及运行Java应用程序所需的库,是运行Java程序的基础环境。 - **JVM**则是JRE的核心组件,负责执行Java字节码。 #### 四、Java技术平台划分 按照应用领域的不同,Java技术体系又可以划分为四个...
OpenCard Framework的核心功能在于它的插件体系结构,这种架构使得开发者可以创建自定义的智能卡驱动程序,以便与不同的卡片类型进行交互。这些驱动程序通常被称为“卡片管理器”(Card Manager),它们负责处理卡片...
比起JM所支持的核心类更少,但它也有属」自凵的扩充类,如 Javacard.*、 javacard. 这些类 Smartcard版本只支持 Boolean与Bytc这两种Java基本类,此版本定位在 SmartCard 的应用上 四:闲话 ava 1:Java历史 在上世纪90...
为了在Java SE 6环境中实现XML数字签名,我们可以使用`javax.xml.crypto.dsig`包提供的API。具体步骤包括创建`DOMSignContext`对象、设置签名参数、构建`SignatureMethod`和`DigestMethod`对象等。 例如,可以使用...
J2ME的体系结构由三部分组成: - **配置层(Configuration)**:定义了运行环境的基本特征。 - **规范层(Profile)**:为特定类型的设备提供必要的API集合。 - **可选包(Optional Packages)**:提供额外的功能扩展。 #...
7. 计算机体系结构: - I/O中断:当外部设备完成数据交换请求时,向CPU发出的中断信号。 - IO/I/O:计算机系统中用于输入和输出的设备或接口。 8. 软件应用领域: - JCB(Java Card):针对智能卡应用的Java平台...