账号:
密码:
最新动态
产业快讯
CTIMES / 文章 /
加解密装置存取接口程序设计
资策会网络多媒体研究所专栏(5)

【作者: 陳振寰】2009年08月06日 星期四

浏览人次:【6399】

使用账号密码作为认证机制的系统,已是十分普遍,像是网络商店、BLOG、网络银行、On Line Game等。然而人类可记忆的账号密码已无法满足安全性需求,用户需要更强大的机制提供更安全的认证机制,或具备其他信息安全的特征。在这样的背景下,应用程序需要借助密码学算法与电子密钥,使用各式各样的加解密装置(Crypto Token;提供电子密钥保全机制与相关密码学算法的硬件或软件系统),如IC卡、USB Token、安控服务器(HSM)等,执行各种加密、解密、签章等动作来满足电子交易安全的需求。相关应用程序从个人使用的Web ATM、网络报税使用金融芯片卡与自然人凭证芯片卡,企业组织的电子密钥管理系统(KMS)使用大型硬件加解密装置(HSM)等,皆属于此种应用模式。



应用程序开发者透过装置业者所提供的软硬件接口,操作加解密装置并使用其内的密钥来进行加解密动作。然而琳琅满目的装置与各种软硬件接口,一则提高了开发应用程序的困难度,二来被装置规格绑死,阻碍了相关应用的发展。因此需要一个依据功能性需求所定义的共同接口,让加解密装置业者能够依据接口开发中间件,而应用系统业者能够使用标准接口的中间件开发系统。



共通的接口Cryptoki


Cryptoki代表了Cryptographic Token Interface的缩写,即是定义一组标准化的Crypto Token高阶操作接口,描述了Crypto Token可能提供的密码学算法、受保护的各类对象与标准化的操作流程。将Crypto Token与应用程序间彻底切割,撰写应用程序不需要了解底层的Crypto Token如何实做、如何与操作系统沟通等,也不会被加解密装置业者绑死;而装置业者则专注在如何实作Crypto Token,并撰写「标准」的API供应用程序开发者使用。



《图一 应用程序、Cryptoki与Crypto Token 的关系 》


目前市面上所出现的Cryptoki标准大致上为两种:CSP与PKCS#11。CSP全名是Cryptographic Service Provider,是微软所提出的标准,CSP设计必须与Windows操作系统紧密结合,加解密装置业者在实做CSP后,须将程序送交微软审核签署后发行,以确保CSP的安全性;应用系统业者通常不直接使用操作CSP API,而透过使用微软CAPI(Cryptographic API)间接地操作CSP。PKCS#11则是由RSA Laboratories所提出的,它是以ANSI C的方式实做,并以动态模块(.dll或.so档案)方式发行,因此可以很容易的移植到不同的操作系统如Microsoft Windows、Linux等Unix like OS。



PKCS#11


PKCS#11详细定义了操作加解密装置所需的运作模式、用户模式、函式接口、错误码、对象类别与对象所支持的各种加解密算法机制(Mechanism),应用系统开发者仅需使用少数操作模式与各类常数,就能够使用或操作加解密装置内各类对象与密钥,或用其密钥进行加密。以下即简介其内容与如何撰写一个PKCS#11程序。



Slot V.S. Token


Token代表一个可储存密钥的装置实体,可以是一张智能卡、一台安控服务器等。而PKCS#11则定义虚拟的插槽(Slot)用来对应实体的Token,其对应方式没有一定的规则,一对一、一对多或多对一的关系,皆是可能的对应关系;一个Slot可以对应一个实体的USB Token或一张IC卡亦或是HSM中的一部分;又或者是一个Slot对应多台安控服务器。对应的规则完全看加解密装置业者依据需求赋予不同的意义。应用系统开发者仅需要把每个Slot当成一个独立的Token。



PKCS#11的对象类别架构


而在Slot的下面管理多种类型的对象,每个对象都包含了许多的属性(Attribute),大致上可分为几类:一、对象的辨识数据,如Label、ID、Subject等,用来与其他对象区分的辨识值;二、对象的储存特性,如Token、Private,描述对象是否永久存在,是否公开使用,或是否受到保护不能导出等;三、描述对象支持的操作(如Encrypt、Decrypt、Sign、Verify等);四、放置对象的值,可能是密钥值或数据值(如Value、Modulus等)。对象可以整理成一个类别阶层,子类别除了有自己专属的属性外,亦继承父类别拥有的属性。例如今天有一个Secret Key对象产生,这个对象则包含了其父类别Key与Storage的属性,因此在Secret Key应包含Token、Encrypt等属性。如图二所示。



《图二 类别架构》


PKCS#11的属性样板


为了搜寻PKCS#11内的对象或是读取对象的属性值,经常使用「样板」(Template)的方式,即是建立一个放置「属性」的数组,包含了属性的代码与属性值,用户可透过这些属性过滤出需要的对象;在另外一方面,样板可用来当成设定(Set)或取出(Get)对象的属性的媒介。用户可以只填入属性代码,API会将属性值「回填」到样板数组中,透过这样的方式取得属性值。



PKCS#11的用户模式与状态循环


要使用Slot内的对象前,必须建立一个Session,使用C_OpenSession函式选择一个Slot并开启一个Session(会议期),才能够进行进一步的对象操作或使用算法。而C_OpenSession、C_CloseSession、C_Login、C_Logout、C_Initalize、C_Finalize为PKCS#11主要状态循环的操作函式。C_Initalize、C_Finalize代表PKCS#11模块与加解密装置的整体初始化与结束,提供模块或加解密装置取得或清除系统资源的时机。当呼叫C_Initalize进行初始化,状态就会进入「初始」的状态,准备接受应用程序提出开启交易的请求。而用户呼叫C_OpenSession之后,状态会进入「Public Session」的状态,此时由于并没有登入选定用户模式,因此只能操作公用对象。假设用户呼叫了C_Login,状态则会进入Private Session,代表可以操作公有与私有对象。如果用户想要更换登入的用户模式,则可呼叫C_Logout让状态回复到Private Session的状态,并且重复呼叫C_Login。若用户使用完成或需切换到另外一个Slot时,则需呼叫C_CloseSession将状态回复到初始状态。除此之外,PKCS#11定义了两种用户模式:SO与User,只有在C_Login时选择User模式时,可以自由操作Slot内的对象,SO模式则是用来做初始化Slot等系统管理功能。



《图三 PKCS#11状态循环》


使用JAVA开发PKCS#11程序


一般开发PKCS#11程序大多使用ANSI C,过去使用Java开发PKCS#11的程序,需要以JNI(Java Native Interface)的方式来写,由于必须跨越C与JAVA两种语言,且开发动作繁复,因此一直是Java开发导入PKCS#11的障碍。所幸Sun J2SE 1.5以后的版本,开始支持PKCS#11。J2SE提供两种呼叫PKCS#11的方法,一种是包成JCA/JCE的方式;另外一种叫做PKCS#11 Wrapper,是将PKCS#11所提供的函式与常数,依据PKCS#11 API的形式包装成Java的类别成员函数与常数,放置在sun.security.pkcs11.wrapper这个包裹里面。这也是笔者较为推荐的方式,原因其一是PKCS#11开发者可以完全遵循PKCS#11所定义开发模式来开发相关程序,其二是JCA/JCE的方式并没有完整实做PKCS#11可能提供的所有功能,使得程序开发人员在开发相关程序会有所限制。



在使用C语言开发PKCS#11程序,需要加载PKCS#11模块(.dll 档案或 .so档案),取得PKCS#11函式Handle并呼叫C_Initalize进行初始化,在不使用之后还需呼叫C_Finalize并释放模块,程序开发者必须小心管理模块与状态,才能维持程序正常不出错。而PKCS#11 Wrapper的PKCS11类别,程序开发人员仅需呼叫静态函数getInstance取得一个PKCS11实体,就可以随心所欲的操作PKCS#11 API所提供的函式,毋需管理PKCS#11模块的状态,这是因为PKCS#11被设计成一个单体,只有在第一次呼叫getInstance时,程序会加载PKCS#11模块并进行初始化,之后呼叫所取得都是同一个实体,只有在对象被GC清除时才会呼叫C_Finalize并释放PKCS#11模块。



Java PKCS#11 Wrapper所提供的PKCS11Constants类别放置了所有PKCS#11会使用到的「常数」,受限于篇幅完整详述,读者可于RSA Laboratories取得完整PKCS#11的文件;有关于属性的常数可查询开头为CKA的常数,对象类型可查询开头为CKO的常数,与密钥类型相关的可使用CKK开头的常数,与机制的相关的对象可查询开头为CKM的常数,搭配PKCS11类别的PKCS#11成员函数,应可满足程序开发人员在使用PKCS#11接口的需求。



---作者任职于资策会网络多媒体研究所---



相关文章
人工智慧引动CNC数控技术新趋势
高频宽电源模组消除高压线路纹波抑制干扰
当磨床制造采用Flexium+CNC技术
电动压缩机设计ASPM模组
【新闻十日谈#40】数位检测守护健康
comments powered by Disqus
相关讨论
  相关新闻
» 美光针对用户端和资料中心等市场 推出232层QLC NAND
» 摩尔斯微电子在台湾设立新办公室 为进军亚太写下新里程碑
» 爱德万测试与东丽签订Micro LED显示屏制造战略夥伴关系
» 格斯科技携手生态系夥伴产学合作 推出油电转纯电示范车
» Arm:因应AI永无止尽的能源需求 推动AI资料中心工作负载


刊登廣告 新聞信箱 读者信箱 著作權聲明 隱私權聲明 本站介紹

Copyright ©1999-2024 远播信息股份有限公司版权所有 Powered by O3  v3.20.1.HK84R9AQ03WSTACUK8
地址:台北数位产业园区(digiBlock Taipei) 103台北市大同区承德路三段287-2号A栋204室
电话 (02)2585-5526 #0 转接至总机 /  E-Mail: webmaster@ctimes.com.tw