基于JavaCard的用户凭证管理模型设计
2008-06-24
作者:罗建宏
摘 要: 针对利用网络服务时产生许多凭证信息或重要信息需要妥善保管这一实际应用问题,利用JavaCard技术并结合JAAS认证和授权服务,提出了基于Java智能卡的移动解决方案,实现了用户凭证信息管理的双因素认证防护,并分析了该方案的安全机制,实现了用户凭证信息安全" title="信息安全">信息安全。
关键词: 凭证管理 JavaCard技术 智能卡
随着因特网的普及,人们可以越来越多地使用网络服务,网络服务在给人们带来便利的同时,也带来了一些麻烦。用户收发电子邮件需要凭证(用户名/密码或相关信息);登录网上银行需要相应的凭证;访问特定的信息也需要输入凭证,类似的例子举不胜举。不同的系统平台对信息认证有不同的要求。而且用户对各种各样的凭证信息很容易遗忘或记错。毫无疑问,凭证对保护个人信息是至关重要的。凭证信息的可靠保存应具备如下特征:
(1)凭证保存必须保证安全性。这表现在能正确保存各种用户名、密码等信息;防止黑客窃取凭证信息;保证凭证数据的私有性;需要对信息加密并安全存储。
(2)用户在需要时能方便地获取凭证。这主要表现在凭证信息的可移动性;用户可以在任何需要的地方(如办公室、家里等)获取相应的凭证访问相应的服务;保存凭证的设备是可随身携带的,甚至可放在钱包里(如智能卡)。
(3)保存凭证的技术需具有可移植性。JAVA语言编写的软件具有较强的可移植性,适用于不同的操作系统平台。
基于上述三点,明确了用户凭证管理的解决方案:使用JavaCard技术和JAVA平台设计,一个用户使用一张智能卡,用户经身份认证" title="身份认证">身份认证后可对保存在智能卡中的凭证操作,该方案必须包含上述三点要求及安全性要求。
1 Java Card技术概述
Java Card最初由Schlumberger 提出,目前已被JavaSoft制定为一项标准,作为一项极有潜力占踞主导地位的智能卡标准。Java Card技术使得Java语言编写的程序能够运行在智能卡上或其他内存受限的设备中。Java Card技术可被部署在许多产业部门,如手机、社会保障卡及金融服务等。Java Card技术包含三个部分:
(1)Java Card虚拟机(JCVM)规范,定义了用于智能卡的Java程序语言的一个子集和虚拟机规范。
(2)Java Card运行时环境(JCRE)规范,定义了Java Card运行时环境的行为:内存管理、应用管理、安全执行,以及其他运行时特性。
(3)Java Card应用编程接口(API)规范,描述了专门为智能卡程序进行程序设计所用的Java Card包和类核心及扩展的集合。
以上三个部分为智能卡提供了一个安全的平台。Java Card平台依据智能卡厂商的特定技术,将应用程序" title="应用程序">应用程序拆分成小应用程序,并且为这些小应用程序提供标准系统和API接口。
Java Card规范使得Java技术能够在智能卡和其他内存受限的设备上运行。Java Card技术具有独特的优势:
(1)互操作性。用Java Card技术开发的小应用程序可以运行在任何基于Java Card技术的智能卡上,而独立于卡的生产商和底层的硬件。
(2)安全性。Java Card技术依赖于Java编程语言的内在安全性,从而提供了一个安全可靠的执行环境。
(3)多应用并存。Java Card使得多个应用程序可以在单个智能卡上并存。一张卡发放后,新的应用程序可以安全地安装。
(4)和现有标准的兼容性。Java Card API和现有的智能卡国际标准兼容,如ISO7816标准。
在Java Card技术中,即使卡被断电以后,卡上存储的几乎全部信息都还保留着。持续内存技术使得在掉电时智能卡仍然能保存信息。由于虚拟机和卡上创建的对象用来表示持续化信息,JCVM看起来一直在运行。断电时,VM只是暂时停止。当下次卡重新启动时,VM重新启动并且从持续化存储器中恢复前面的对象堆。除了其持续化特性,Java Card虚拟机和Java虚拟机是基本一样的[4]。
2 基于Java Card的用户凭证管理模型设计
根据Java智能卡的特点及用户凭证管理的目的,可设计如下管理模型,如图1所示。
该模型采用C/S结构,每一台客户应用计算机作为Client,而java智能卡充当Server角色,两者通过与计算机相连的卡接收设备(CAD)连接。卡接收设备又可称作终端、读卡器和IFD(接口设备),它们都具有相同的基本功能,即向智能卡提供电源和建立数据传输连接。当Client端某个服务需要输入凭证(如用户名/密码)时,读卡器激活插入的java智能卡,经验证java智能卡用户身份后返回卡中相应的凭证信息到Client端,这时候用凭证信息可以访问相应的服务资源。该方案利用二道关卡保护系统的安全,即双因素认证(two-factor authentication),通过安全装置(用户自己保管智能卡)和智能卡的个人辨识密码(PIN)双重保护,避免对服务资源非授权存取。
2.1 Java智能卡的身份认证
本文中的模型完全基于Java技术,Java技术广泛应用于多用户环境中。合法使用java智能卡是以用户为中心(user-centric)的访问控制,因此必须基于用户的身份授予其不同的许可。用户必须经身份认证后才有权使用保存在java智能卡中的凭证信息,这是保证用户信息安全的第一道关卡。本文通过Java认证和权限服务JAAS(Java technology Authentication and Authorization Service Software)来完成。JAAS已完全集成在J2SE1.4平台中,它是Java平台的扩展security API,是可插拔鉴定模块(Pluggable Authentication Module,PAM)的java实现。JAAS分为认证(authentication)和授权(authorization)两部分。
认证就是对一个用户身份鉴定权限的处理过程。JAAS认证机制是基于PAM的,所以它支持允许系统管理员插入适当的鉴别机制以满足安全要求的体系结构,这种体系结构也允许应用程序独立于底层鉴别技术。因此,当有新的鉴别服务出现或当前服务需要更新时,系统管理员无需调整或重新编译现有的应用程序就能轻松进行部署。客户应用(Clinet Application)总是通过登录上下文(LoginContext)对象和JAAS交互,如图2所示。
典型的认证处理过程要经过下面的步骤:(1)生成一个LoginContext对象。这个LoginContext寻找登录配置文件以决定使用那个LoginModule。(2)通过调用LoginContext的login方法执行认证,它会加载预定义的LoginModule去检验是否用户可以被认证。(3)如果用户被认证,则用规则(Principal)和标识和其所属项(subject)进行关联。(4)或者在登录失败的情况下抛出一个LoginException。(5)使用LoginContext的logout方法进行注销登录。
在JAAS中,登录是一个二阶段(two-phase)的处理过程。第一阶段是“登录(login)”阶段如上面步骤2所描述的。这个阶段惟一的任务是认证。只要处理过程成功通过这个阶段,认证处理过程就进入了“提交(commit)”阶段如上步骤3,这一阶段LoginModule的commit方法被调用去关联所属子项(subject)相关的规则(Principal)和标识。在JAAS中一个所属子项表示一个认证实体,例如一个人或者一台设备。
鉴别是授权的基础,特别是在知道subject的身份时,应用程序要指定subject可以执行的动作行为。Subject只是表示无名的容器,用来为subject容纳相关信息,而Principal表示subject的鉴别身份。授予subject的许可集取决于与subject相关联的Principal,而不是取决于subject本身,这就是说,根据subject包含的鉴别Principal来赋予subject的权限。授予的权限许可集可以通过外部访问控制策略来配置,策略配置文件包含了可以进行安全敏感操作的入口,如访问一个具体的Web页面或者本地的文件。
2.2 模型架构及实现
根据图1,可设计C/S结构的用户凭证管理模型架构,如图3所示。客户端" title="客户端">客户端的任何应用都必须经过JAAS对Java智能卡的认证与授权,只有被授权后,客户端的应用程序才能访问Java智能卡中的特定信息。这时通过Java Card的RMI(Remote Object Invocation)接口JCRMI(RMI for Java Card Platform,Java Card远程方法调用" title="方法调用">方法调用)与Java智能卡上通信,从而得到Java智能卡中的相应信息。当然,这中间需要通过读卡设备连接智能卡,信息传输通过Card Service API支持。当二台计算机彼此进行通信时,它们交换根据一系列协议构造的数据包。同样Java智能卡也使用自己的数据包——称作APDU(应用协议数据单元)与外部世界对话。APDU包含一条指令或响应信息。在智能卡里采用的是主从模式,而智能卡扮演从动的角色。换句话说,智能卡总是在等待来自终端的命令APDU。随后,它执行APDU规定的动作,并以一个应答APDU向终端作出回答。JCRMI包含了智能卡与终端之间互相交换命令APDU和应答APDU的方法exchangeAPDU()。
在图3右边,是整个架构的Server端,描绘了JCRMI调用位于Java智能卡上的方法的机制。这些方法在Remote Interface(远程接口)中声明。Java智能卡中的应用类(实现用户凭证操作的类)APP Remote Class继承Java Card平台中的CardRemoteObject类并实现(Implements)Remote Interface的方法。在实例中,purseImpl 类代表图3中的APP Remote Class。Java Card API 中的Dispatcher和RMIService处理APDU(应用协议数据单元)对象及Java Card 平台的RMI请求(request)。Java Card应用程序称为applets,一个卡上可驻留多个applets。每个applets均被其AID(应用程序标识符)惟一标识,如ISO 7816第5部分的规定。在图3中,当Java智能卡插入读卡器,执行用户凭证管理的Applet被选中后激活,这时候Client端的应用程序就可以通RMI访问Java智能卡中的信息了。Java Card applet是用一般的Java编译器编译的。编译器的输出结果(class文件)被输入Java Card转换器,转换并优化Java字节代码使之更适合在Java Card虚拟机上运行。转换器的输出结果被下载到Java Card上。
以上是整个模型架构的工作机制,这个模型的第一道安全关卡由JAAS来实现,下面分析利用JavaCard实现用户凭证管理的其他安全机制。
(1)JCRMI及事务的原子性
Java Card远程方法调用是Java远程方法调用(RMI)的一个子集,它为运行在卡接受设备(CAD)或读卡器平台上的客户端程序提供了一个调用位于卡上的远程方法的机制。程序包javacard.framework.service中的类RMIService为JCRMI提供了卡上传输层,当基于JCRMI的applet是当前选定的applet时,这个传输层被设计成一个由applet请求的服务。被传送到RMIService方法的APDU对象封装了JCRMI消息。
事务是持续性数据更新的一个逻辑子集。例如,从一个帐号传送到另一个帐号是一个银行事务。事务的原子性是很重要的:要么更新所有的数据域,要么一个也不更新。JCRE提供了针对原子操作的灵活支持,这使得如果事务没有正常完成,则卡上的数据恢复到其原始的事务状态。这种机制防止了一些突发事件,例如在事务过程中突然掉电,以及防止了一些可能造成数据错乱的程序错误,它们可能造成事务的各个步骤没有全部完成[4]。
(2)Java Card的Applet隔离
隔离意味着一个applet不能访问在另一个上下文(context)中的applet的方法或字段,除非其他applet显式地提供了访问接口。Java Card防火墙提供了大多数常见的安全问题的防护:可能允许敏感数据泄漏给另一个applet的开发错误和设计失误。为了从一个公共可访问的位置获得一个对象引用,applet在使用引用访问对象之前,必须满足某些访问规则,防火墙还提供了针对不正确代码的防护。如果卡加载了不正确代码,防火墙也会防止这个代码访问对象。本例中,用户身份被JAAS认证后再被授权可访问Java智能卡中的凭证信息,这是由JavaCard中的applet来引用访问相应的对象,applet只能跟当前的context关联,其他applet不能访问当前context中的applet,所以每一个applet中的数据是安全的。
(3)Java Card中的信息加密
Java Card中有一个安全API javacard.security和一个密码学API java.cardx.crypto,它们分别提供了和J2SE相应模块java.security和javax.crypto类似的功能,这些功能实现了Java Card的安全和密码学框架,提供一系列不同的加密算法,签名算法、密钥产生等功能,这些功能方法在JavaCard2.2.1平台中已更新并进一步加强。对Java智能卡中的数据经常需要转移(如读、写、存),为保证在这个转移过程中信息的安全性,信息可以被加密以保证完整性和正确性。运用javacard.security和javacardx.crypto程序包,首先创建DES密钥,然后创建和初始化一个cipher对象,最后加密信息。在读取卡中保存信息时,使用RMI调用解密方法对信息解密。
2.3 关键代码实现
(1)定义purse接口(remote interface),包含验证PIN信息,保存凭证信息、删除凭证信息等方法。
public interface purse extends RemoteInterface
{
……
public void verfyPIN(byte[]PIN) throws RemoteException,UserException;
public void createNewCredential(String serviceName,String login,String password)
throws RemoteException,UserException;
public void deleteCredential(String serviceName) throws RemoteException,UserException;
……
}
(2)定义类purseImpl(见图3中的My Remote Class),继承CardRemoteObject,并实现purse接口(remote interface)。
public class purseImpl extends CardRemoteObject implements
purse
{……
public void verifyPIN(byte[]PIN) throws RemoteException, UserException {
//check the PIN here
}
}
(3)定义类myApplet(见图3中的Applet),它是javacard.framework.Applet的子类。实例化purseImpl,并通过Dispatcher和RMIService处理Client和java智能卡间的信息交换。
public class myApplet extends javacard.framework.Applet
{
private Dispatcher disp;
private RemoteService serv;
private Remote purse;
public myApplet() {
purse=new purseImpl();
disp=new Dispatcher( (short) 1);
serv=new RMIService(purse);
disp.addService(serv,Dispatcher.PROCESS_COMMAND);
register();
}
public void process(APDU apdu) throws ISOException
{ disp.process(apdu);}
}
智能卡是越来越受欢迎的易携带设备,使用此方案,用户使用一张随身带的智能卡,可实现对多种密码、凭证信息的管理(读、写、备份)。本文中的模型架构充分利用了Java Card平台的优势,并结合JASS认证与授权的功能安全处理卡中的信息,实现了用户凭证信息管理(credential management)的双因素认证防护,同时分析实现了Java智能卡中的信息安全。另外,该模型是开放的体系结构,可方便地与其他应用集成,具有扩展性。Java Card技术是基于Java语言的,所以,它还具有Java程序应用的优点。总之,本文描述的用户凭证管理模型设计,是针对普遍的用户需求而设计,具有较强的实用价值。随着Java Card技术的日益成熟,java智能卡将越来越普及,用户只要拥有一张智能卡,生活将变得更轻松。
参考文献
1 Java Card Technology(2.2.1).http://java.sun.com/products/javacard/
2 Java Card RMI.http://java.sun.com/products/javacard/RMI_Client_API.pdf
3 JAAS.http://java.sun.com/products/jaas
4 Gong L著,朱岱译.深入Java 2平台安全——体系架构、API设计和实现(第二版).北京:电子工业出版社,2004