基于USBKey的考试系统安全的设计与实现

2016-03-08 01:53徐涛文福安
软件 2016年1期
关键词:数据安全

徐涛++文福安

摘要:本文分析了在线考试系统存在的安全问题,结合PKI体系和数字证书,为自主开发的在线考试系统设计了一个基于硬件USBKey的考试系统数据安全传输的解决方案,并进行了实现,解决了开发过程中遇到的一些关键问题,尤其是C/C++和Java之间跨语言的相互加密和解密的通信问题。

关键词:考试系统;USBkey;数据安全;PKI体系;PKCS#II

中图分类号:TP311

文献标识码:A

DOI: 10.3969/j.issn.1003-6970.2016.01.002

0 引言

随着Internet的快熟发展与普及,基于web的考试系统越来越受到欢迎,与传统考试相比,在线考试系统是传统考试的延伸,有其独特的优点。它可以充分利用计算机网络的无限广阔空间,没有时间和地域限制,可以随时随地进行考试,交互功能远强于传统纸质,系统发布和版本升级方便,资源共享,信息丰富,便于实施统一的训练管理,大大简化了传统考试的过程,部署成本低,实时性强,有效地克服了传统纸质考试的缺点,具有高效、灵活、便捷等特点。但是基于web的在线考试系统是以Internet为传输媒介的,考试系统中的题库、试卷、需提交的答案、管理指令等都要经过网络进行传输,而Internet却是一个开放的、松散的和易受攻击不安全的网络环境,这对在考试系统中,上述需要经过网络进行传输的各种数据的安全构成了很大的威胁。本文针对这个问题进行了研究,为自主开发的考试系统设计了一套基于硬件USBKey的考试系统数据安全传输的解决方案,并进行了实现,解决了开发中遇到的一些关键问题,尤其是C/C++和java互相通信加解密的问题。

1 USBKey简介

USBKey(智能密码钥匙)是新一代身份认证产品,它结合了智能卡技术、现代密码学技术和USB接口技术。外形酷似U盘,具有唯一性和不可复制性;内置微型智能卡处理器,采用1024位或更高位的非对称密钥算法对网上数据进行加密、解密和数字签名认证,确保网上信息传输的保密性、真实性、完整性和不可否认性。是目前各大银行给用户采用的最高级别的安全工具。

每个USBKey都具备硬件PIN码保护,用户能够正常使用USBKey的两个必要因素就是硬件本身和PIN码。只有同时取得了USBKey和用户的PIN码,才能够登录系统。所以,即使用户的PIN码和USBKey其中之一被盗或丢失,也无法获得合法认证。

USBKey内部有一定的存储空间,可以存储用户的私钥、会话秘钥以及数字证书等机密数据,对该存储空间的读写操作必须要通过USBKey内的程序实现,用户无法直接读取数据,这就大大保证了用户私钥的安全性。并且,利用USBKey内置的CSP (CryptographicService Provider,加密服务供应器)模块中的公钥算法可以实现对用户身份的认证以及秘钥的安全传递,所有的加解密运算都只能在USBKey内部进行,这也就杜绝了用户的私密信息被黑客截取的可能性。

USBKey制造商将USBkey和PKI技术结合起来,利用USBkKey来保存数字证书和用户私钥。USBKey一般都提供了PKCS#II和CSP for Microsoft Cryp-toAPI两种主流的应用接口,这两个接口分别遵循RSA公司开发的PKCS#11标准和微软公司制定的MSCryptoAPI接口标准。本次研究就是将供银行客户端使用的硬件USBKey移植到考试系统中,根据所开发的考试系统的特点,设计一套考试系统数据安全传输的机制并实现,以此来提供银行级别的数据传输的安全保障及身份认证。

2 加密算法与PKI体系

2.1 密码学基础

数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。

根据密钥类型的不同,可以将现代密码技术分为两类:对称加密技术(秘密钥匙加密)和非对称加密技术(公开密钥加密)。

2.1.1 对称加密技术

对称密码体制又称单钥或私钥(Privare-key),是从传统密码学中的简单移位、代替发展而来的。对称密码体制的特点是加密和解密采用相同的密钥,即加密方利用一个秘钥对数据进行加密,解密方接收到数据后需要使用同一秘钥进行解密。因此在通信过程中,通信双方需要使用安全信道来传输并保存他们的公共密钥。对称秘钥体制的安全性严重依赖于公共秘钥的安全性。这种加密技术的优点是算术运算量小,对机器要求较低,加解密速度快。然而其公共秘钥的安全交换却成了个严重问题,一但通信过程中公共秘钥泄露,那么通信的安全性便无法保证。

目前,广泛使用的对称加密算法主要有:DES、3DES、高级加密标准AES等,其中AES算法是用来替代经典算法DES的。AES算法基于排列和置换运算,排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。

2.1.2 非对称加密技术

非对称加密算法又叫公开秘钥加密算法或双秘钥加密算法。它需要两个密钥:公开密钥和私有密钥。公开密钥和私有密钥组成一个密钥对,如果用公开密钥进行加密,那么只有用对应的私有密钥才能解密;如果用私有密钥进行加密,那么只有用对应的公开密钥才能解密。公开密钥体制最大的优点就是不需要对通信中密钥进行加密传输,公开密钥可以明文传输,这样就省去了一条开销很大的密钥传递信道。但是,公开秘钥体制有一个很大的缺陷,那就是其加密和解密的运算时间比较长,时间一般是对称加密体制的100倍以上。因此,这在一定程度上限制了它的应用领域。

目前使用比较多的公认安全的算法就是RSA算法了,RSA算法是基于大数分解难题的一种算法,目前没有好的方法去攻破RSA算法,暴力破解需要花费太长的时间,基本不可能破解。

2.2 PKI体系

为解决Intemet的安全问题,世界各国对其进行了多年的研究,初步形成了一套完整的Internet安全解决方案,即目前被广泛采用的PKI技术(Public KeyInfrastructure-公钥基础设施),PKI(公钥基础设施)技术采用证书管理公钥,通过第三方的可信任机构一认证中心CA (Certificate Authority),把用户的公钥和用户的其它标识信息(如名称、e-mail、身份证号等)捆绑在一起,在Internet上验证用户的身份。目前,通用的办法是采用建立在PKI基础之上的数字证书,通过把要传输的数字信息进行加密和签名,保证信息传输的机密性、真实性、完整性和不可否认性从而保证信息的安全传输。

PKI系统主要由认证机构(CA)、注册机构(RA)、证书管理机构、实体等部分组成。CA是PKI体系的核心,负责证书的颁发和合法性管理;RA是CA与用户的良好隔离机构,使得用户不直接与CA接触,向RA申请注册证书,RA验证用户申请后,生成标示符转达给CA生成证书;证书管理系统负责证书的发布和撤销;实体是PKI证书的使用者

3 考试系统安全设计

为解决在线考试系统的安全问题,引人PKI安全体系,在PKI基础之上以数字证书的形式解决了公钥信息的存储表示问题,通过把要传输的数字信息进行加密和签名,保证信息传输的机密性、真实性、完整性和不可否认性。同时使用硬件USBKey,通过该USBKey中的存储空间存储用户的私钥、会话秘钥以及数字证书等机密数据,并通过该硬件保证用户的私钥不可导出,这样以来就又充分保证了私钥等机密信息的安全性。用户只能通过USBKey内部的CSP模块访问私密数据,提供了银行级别的安全性。

由于USBkey具有极高的安全性,能够很好的满足考试系统对安全性的要求。因此,考试系统的数据安全通信流程架构设计如图1所示。服务器端设有服务模块和加解密模块,考生机客户端由浏览器和USBKey组成,而浏览器通过插件Plugin访问USBKey。

上图结构中分为考生机客户端和服务器两个部分。在客户端部分,浏览器通过plugin调用插件,plugin采用C/C++语言开发,封装了USBkey提供的加解密算法C语言接口,并向浏览器提供用于RSA加解密的JavaScript接口;在java服务器端部分,采用软加解密方式,调用编写的CSP加解密算法模块完成所需功能。

客户端网页和java服务器端通过RSA验证用户身份并传输数据的通信流程如下:

i.客户端网页通过确认按钮,将页面信息A(用户名、密码等)发送给服务器;

ii.服务器收到信息A后,将:信息A+当前系统时间+随机码序列(为了防止重放攻击) 形成的数据B保存在服务器上,并通过服务器的加密函数将上述信息以客户公钥加密的方式加密成数据C发送给客户端页面;

m.客户端收到该加密数据C后,用自己的私钥解密,再用服务器公钥加密后,形成数据D发还给服务器;

IV服务器收到数据D后,用自己的私钥解密,并与服务器上原先保存的数据B进行比对,若完全一致,则服务器认为请求者是合法用户,允许用户的登录操作。并通过该方式获取对称加密算法AES的会话秘钥。

4 研究中遇到的技术难点及解决方案

4.1 公钥导入问题

由于USBKey内部有一定的存储空间,用来存储用户的私钥、会话秘钥以及数字证书等机密数据,而对该存储空间的读写操作必须要通过USBKey内的CSP (Cryptographic Service Provider)模块实现,用户无法直接读取数据。因此只有把服务器的公钥导入到USBKey中才能让CSP去访问该公钥,完成RSA加密。经研究发现USBkey提供的PKCS11接口中的C_CreateObject()函数能够将封装好的公钥导入到USBKey中。C_CreateObject()的函数定义如下:

C_CreateObj ect创建了一个新的对象。hSession是对话的句柄;pTemplate指向对象的模板;uICount是模板中的属性数;phObject指向接收新对象句柄的单元。

在使用该函数前,需要先定义公钥模板并对其中的参数赋值.然后才能导入。模板定义方式如下:

CK—ATTRIBUTE pubTemplate[]=

{

{ CKA_CLASS, &pubClass, sizeof (pubClass)),

{CKA_ KEY_7IYPE ,

&keyType ,

sizeof(keyType)},

{CKA_SUBJECT, subject. sizeof (subject)),

{ CKA_MODULUS_BITS, &uIModulusBits,sizeof (uIModulusBits)},

{ CKA_MODULUS, modulus, sizeof (modulus)},

{ CKA_PUBLIC_ EXPONENT, exponent, sizeof(exponent)},

{CKA_ENCRYPT, &bTrue, sizeof (bTrue)},

{ CKA_TOKEN, &bTrue, sizeof (bTrue)},

{ CKA- WRAP, &bTrue, sizeof (bTrue)},

);

4.2 C++和java加解密通信问题

考生机客户端和java服务器端进行双向加密和解密的通信过程中,C/C++加密后的数据通过网络传输到java服务器端进行解密时失败,报出bad_key的错误;同时java服务器端加密的数据经由网络传送到C/C++客户端解密时,也是失败,同样报出bad_key的错误。针对这个问题,研究发现,这与计算机体系中的字节序Big-Endian和Little-Endian有关。

4.2.1 大端模式与小端模式

在各种计算机体系结构中,对于字节、字、基本数据类型等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果达不成一致的传送顺序规则,通信双方将无法进行正确的编/译码从而导致双方通信失败。

现代的计算机系统一般采用字节(8 bit Byte)作为逻辑寻址单位。每个地址单元都对应着一个字节,一个字节为8bit。然而在C/C++语言中除了8bit的char之外,还有16bit的wchar t型和short类型,32bit的Int及long类型,64位的double及long long类型(编译器不同,基本数据类型所占的长度也可能不同,具体情况需根据编译器自身的实现)。另外,对于位数大于8位的处理器,例如16位、32位或者64位的处理器,由于寄存器宽度大于一个字节(8 bit),那么必然存在着如何安排多个字节数据存储顺序(Byte Order)的问题。常见的字节存储顺序有两种:Big Endian(High-byte first)和Little Endian (Low-byte first). IntelX86平台采用Little Endian,而PowerPC处理器则采用了Big Endian。另外,对于大小端的处理也和编译器的具体实现有关。

(1) Little-Endian,即小端存储模式。就是指数据的高位字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。C/C++语言采用的存储模式就是Little-Endian,比如有一个双字节变量shortA-OX1234,那么A所代表的变量的第一个字节存储的是OX34,第二个字节存数的是OX12.

(2) Big-Endian,即大端存储模式。就是指数据的高位字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这种存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。Java语言采用存储模式是Big-Endian。比如在Java中有一个双字节变量shortA-OX1234,那么A所代表的变量的第一个字节存储的是OX12,第二个字节存数的是OX34;与C/C++语言中的正好相反。

另外在网络字节序中:TCP/IP各层协议将字节序顺序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。故而网络中传输的数据为Big-Endian类型。

由以上字节序的介绍可知,一个C/C++中的UTF-16编码的字母或者多余一个字节的基本数据类型(short类型,int类型,double类型等),传输到Java语言中,要转换成java语言的Big-Endian位表示形式(逆序顺序交换高低位字节),才能正确译码,反之亦然。

而RSA算法对数据的加密和解密算法均是基于大数质数分解的,比如一个1024位的公钥的模数N,就是一个128字节大小的整数。其加密后的数据也是一个很大的整数。由于加密后的数据是一个大整数,多于一个字节,便也存在大小端表示问题。因此在Java和C/C++中要对解密前的数据按字节进行反转后才能解密成功。

4.2.2 加解密算法的数据转换流程

为了避免数据的多字节存储问题(如UTF-16编码的双字节字符,从C/C++语言与Java语言,就要进行字节序的转换),不管何种语言,均将要加密的明文字符串转换为UTF-8字节流,然后进行加密;解密完成时,再进行UTF-8解码,最终形成正确的明文数据。这样有两个好处:

(l)可以避免UTF-16编码字符带来的大小端转换问题

(2)同时由于使用的数据大部分为英文字符,由UTF-16转换为UTF-8,可以节省一个字节的存储空间,这样便可减小要加密的字节数,加快加解密数据的速度。

因此,考生机客户端(C/C++端)对数据RSA加密的数据转换流程如图2。首先,明文数据经过UTF-8编码,然后调用USBKey中CSP模块完成数据的加密,得到的数据按照一个字节一个字节的逆序翻转,再经过Base64编码,方便在网络上进行传输,保证数据传输过程不会出现差错。上述流程中,加密完的数据进行按字节逆序翻转,是因为RSA加密运算的结果也是一个大整数,也存在大端存储和小端存储的问题,进行转换后,方便JAVA服务器端进行数据的解密。

Java端进行解密时数据转换流程如图3。首先,收到的密文先经过Base64解码,然后调用服务器端CSP模块解密,最后经由UTF-8解码,获得最终的明文数据。

4.3 证书导出公钥

在考生机客户端和服务器通信的过程中,java服务器需要使用客户端的公钥加密数据,因此需要获得客户端公钥。而客户端的公钥存储在USBKey中的数字证书里。因此就需要从USBKey的证书中导出公钥参数,即公钥的模数N和指数E。然而由于RSA算法对数据的加密和解密算法均是基于大数质数分解的,模数N和指数E也都是一个大整数(Biginterger),因此其也存在大端表示和小端表示。C/C++采用LittleEndian,而Java采用Big Endian,因此从客户端证书中读取到N和E后,需要将其按字节反转,转换为java端大端存储形式,才能得到正确的N和E,并用其进行RSA加密。

5 结论

本文为了解决自主开发的在线考试系统的安全问题,引人了PKI安全体系,在PKI基础之上结合数字证书的形式解决了公钥信息的存储表示问题,通过把要传输的数字信息进行加密和签名,保证信息传输的机密性、真实性、完整性和不可否认性。同时使用硬件USBKey的存储空间存储用户的私钥、会话秘钥以及数字证书等机密数据,并通过该硬件保证用户的私钥不可导出,这样以来就又充分保证了私钥等机密信息的安全性。通过这个设计方案,提供了银行级别的安全保障。本人还对这个设计方案进行了实现,解决了遇到的一些关键问题,尤其是C/C++和java跨语言的相互加密和解密的通信问题。

猜你喜欢
数据安全
高速公路ETC用户隐私数据安全保护策略
我国5G数据安全保护供给不足,“四步”拉动产业发展
云计算中基于用户隐私的数据安全保护方法
建立激励相容机制保护数据安全
大数据云计算环境下的数据安全
大数据安全和隐私保护技术架构研究
实时数据库系统数据安全采集方案
云环境中数据安全去重研究进展
数据安全重删系统与关键技术研究
大数据安全搜索与共享