电子拍卖是传统拍卖形式在线实现。卖方可以借助网上拍卖平台运用多媒体技术来展示自己的商品,这样就可以免除传统拍卖中实物的移动;竞拍方也可以借助网络,足不出户进行网上竞拍。该方式的驱动者是传统的拍卖中间商和平台服务提供商(PSP)。
一、移动电子拍卖系统简介及其安全性需求分析
下面将针对我们开发的基于J2ME的移动拍卖系统——“拍趣”拍卖系统(该系统已经成功的移植到手机中)具体地分析一个无线Web服务平台的安全技术实现的案例。
1、移动电子拍卖系统简介
移动电子拍卖系统前台采用J2ME平台实现应用,后台采用Web服务技术实现服务提供者。
移动电子拍卖系统由以下几个部分组成:
1)系统初始化:后台Web服务启动,并公布有关拍卖品的信息;
2)用户注册:每个竞拍者发送其必要信息到服务器端进行注册;
3)用户身份:用户在系统中可以拥有双重身份,既可以作为卖家,也可以作为买家;
4)用户获取拍卖信息:拍卖管理程序提供等待拍卖的商品信息,系统用户可以登录后浏览这些信息;
5)拍卖结束:拍卖成功,买家得到卖家的联系方式,系统通知卖家竞拍过程结束;
6)拍卖失败:通知卖家,竟拍结束。
2、移动电子拍卖系统安全性需求分析
在电子拍卖过程中要保证竞拍者注册信息的保密性及保护竞拍者的出价信息,任何人都无法获得竟拍者的身份及其投标信息。
移动电子拍卖系统应有的安全特性如下:
竞拍者的信息保密性:系统提供对注册用户的信息以及出价信息的安全传输,防止被第三方截获。
竞价信息的数据完整性:用户在出价的时候,客户端应用实现对用户出价信息的签名操作,服务器端可以通过验证签名信息保证数据的完整性。
竞拍服务的真实性:系统为客户端提供了验证签名的应用,对服务器端的数据进行验证,保证接受的服务的真实性。
不可欺骗性:任何人都不能伪装某个已注册的竞拍者进行竞价。
二、移动电子拍卖系统安全架构
移动电子拍卖系统采用单向认证方案,系统的安全架构如图1所示。
系统包括使用对称算法实现加密和非对称算法签名两个阶段过程。
系统在服务器端将产生一个共享密钥,用于使用TripleDES对称加密算法来加密/解密数据。对称算法非常有效,并且可以与用于加密和解密计算的单一密钥一起使用。Web服务安全性(WS-Security)实现使用一个随机生成的密钥。一旦消息的数据被加密,密钥本身就被插人到消息中。
系统在客户端应用中保存了系统用于加密/解密SOAPL21消息的共享密钥。在对SOAP消息操作的时候使用。对于消息的签名使用的是一对非对称密钥——个私有的和一个公共的。这里使用X.509证书格式的密钥,证书中包含有两个密钥,一个是证书的所有者私有的,而另一个是与他们一起开展业务的其他人共享的。
客户端应用对SOAP消息利用私有密钥进行数字签名。这里对SOAP消息体进行签名。经过客户端应用处理的签名消息,包括关于签名的密钥信息就作为二进制安全性令牌包含进SOAP头了。
当服务提供者接收到Web服务请求时,基于请求者的URL,请求就定向到SOAP处理引擎(SOAP运行时)。在请求中传送的消息数据是经过签名和加密的,所以第一步就是识别SOAP头中引用的X.509证书,并从X.509证书链的keystore(相当一个数据库)中检索它的私钥。一旦获得公钥,就可以使用非对称算法来验证签名。通过共享密钥对称算法来解密消息数据。
三、移动电子拍卖系统密钥的产生、存储和更新
服务器端产生密钥后存放在应用中,这里假设服务器端是可信的。服务器端仅提供了对来自客户端的数据的完整性验证。
首先在服务器端产生密钥,提取密钥参数,保留参数值,在发布客户端应用的时候,提取密钥参数值,重新构建密钥,针对所有的客户端,都使用同一对密钥。这一对密钥在服务器端的密钥库中有同样的备份,服务器端收到来自客户端的签名SOAP消息后,利用公钥验证消息的完整性。
提供加密的共享密钥也以密文的形式存储在客户端应用中,在对原始消息加密时使用。
现在需要导出密钥参数。系统首先在服务器端应用中产生用于签名的密钥对和用于加密的共享密钥对后,需要提取出密钥参数,利用这些参数,在客户端能够重新构建密钥对。获取密钥对中私钥的一个参数的方法如下:
privKey 2(RSAPrjyateCrtKeyPararnere)
keyPair. getPrivate();
//导出私钥参数
BiglnteSer privateKeyDP 2 privKey. SetDP();
//在控制台输出密钥参数
System. out. prindn(”privateKeyDP=“+pmrateKeyDP);
//将控制台输出的密钥参数重新赋值构造新的密钥
prjyateKeyDP=new Bigjnteger
”2979750878679664390023599054709331027032702302444708816092225306357352950956680073014685040182357508935392476975479182826100362278654349880244458787077073’);
私钥共有八个参数,需要一一导出并存储,保留在程序中,在客户端重新构建密钥。
如果密钥被长时间存储在服务器端而得不到更新,势必会造成密钥泄密。因此为了防止这种危险情况的出现,密钥应该定时更换。其中有一个需要注意的问题就是密钥的更换时间,无论是签发者或是被签者的密钥作废时间,要与每个证书的有效截止日期保持一致。
此系统采用了如下的技术解决密钥更新的问题,即PKI(Public Key Infrastructure)实体在密钥截止之前,就取得新密钥对和新证书,在截止日期到达后,PKI中的实体便开始使用新的私钥进行对数据的签名,同时将旧密钥对和证书归档保存。
四、移动电子拍卖系统服务器端安全实现
1、安全服务内容
(1)用户注册服务
加密传输:客户端提交注册信息后,消息处理器从原始消息中提取出消息体,针对消息体进行加密,加密的SOAP消息重新封装成一个完整的加密消息发送。
解密数据:在服务器端对用户注册信息进行解密后提交给下一层逻辑。
签名注册信息:对用户注册信息进行签名,到服务器端验证数据的完整性。
用户注册服务的过程如图2所示。
(2)竞拍服务
签名出价数据:对用户提供的出价数据,使用客户端的私钥进行签名后发送,数据发送到服务器端后验证客户端消息的完整性。
加密/解密出价数据:客户端对出价数据加密,服务器端解密出价数据。
竞拍服务的过程如图3所示。
2、自签名证书密钥模型
在服务器端,系统采用X.509格式的证书的方式米存储密钥,在JDKl.4中,提供了一个命令行的工具Keytool。它是安全钥匙与证书的管理工具,管理一个存储了私有钥匙和验证相应公共钥匙以及与它们相关联的keystore。Keytool把钥匙和证书储存到一个keystore中。默任的实现keystore的是一个文件。它用一个密码保护钥匙。
Keystore有两个不同的入口:
1)钥匙入口:保存了非常敏感的加密的钥匙信息,并且是用一个保护的格式存储以防止未被授权的访问。以这种形式存储的钥匙是秘密钥匙,或是一个对应证书链中公有钥匙的私有钥匙。
2)信任证书入口:包含一个属于其他部分的单一公共钥匙证书。它之所以被称为“信任证书”,是因为keystore信任的证书中的公共钥匙真正属于证书所有音的身份识别。
使用JDKl.4自带的工具KeyTooI可以生成一个自签名的符合X.509格式的证书。
生成证书的方法如下:
->kcytool - genkey - alias test - keyalg RSA - keystorc
servertcert.jks(指定keystore文件名)输入keystore密码:
kcystoretcst
您的名字与姓氏是什么?
[Unknown]:Mnbilc Auction
您的组织单位名称是什么?
[Cnknown]: College of Computer
您的组织名称是什么?
[Unknown]:Sichun University
您所在的城市或区域名称是什么?
[Unknown]: Chengdu
您所在的州或省份名称是什么?
[unknown]:Sichuan
该单位的两字母国家代码是什么?
[unknown]: CN
CN=Mobile Auction, OL,r= College of Computcr,
0= Sichuan Univcrsity.L=Chengdu, ST= Sichuan,
C=CN正确吗?
[否]:y
输入的主密码
输入的主密码
如果和lceystort密码相同
按回车
3、验证服务实现
在竞拍服务中,系统提供了对来自客户端的已签名的出价数据的验证,以保证数据的完整性。用户同时提供用户名和密码,系统验证用户的身份,证明用户出价数据的不可否认性。
服务器端进行验证签名服务的部署方法如下(在其部署描述符文件Bid. xml中加入下面显示为斜体的代码):
(class> cn. cdu. cdutscu. ws. Hid
ycs
< - -验证来自客户的针对消息体进行签名的消息—一>
< -ssSignature>
soap: Envelope/soup: llody(/referencc>
senTrccrt.jks< /lrusIStorc>
kcysroretest
4、基于Glue的Triple DES解密服务实现
在系统中已经开发的用户注册服务User中,需要实现对来自客户端的用户注册信息的解密功能。系统使用的Web服务器是Glue5. 01.Clue5. 01企业版已经实现了WS -Security1.O规范,支持XML的签名和加密,它内置的安全包提供了实现方案。在服务器端对User服务进行安全配置的方法如下:
首先需要为加密/解密应用产生一个共享密钥,在应用中可以通过实现产生共享密钥,这里系统使用Glue提供的一个可以产生基于Triple DES算法的对称密钥的工具来产生一个随机的用于加密/解密的对称密钥:
->java TnpleDESKcy
kn89 \\r7 byFYz4 EOXWsOUxnpj/PVu28hWM
客户端利用此密钥加密SOAP消息,服务器端利用它解密SOAP消息。
针对用户注册服务,在其配置描述符文件User. xml中配置解密服务的方法如下:
< service >
< constrvctor >
< class > cn. edu. cdutscu. ws. User
< publish> yes
< ! - -来自客户端请求的SOAP Body的内容是使用此密钥加密的一一>
< wr-sEncryption>
< reference> soap: Envclope/soap: Body/.
< sccretKey>
< rralm> acl
在标签< realm>中表明用户所处的域口在Glue5. 01中,使用了域的概念来实现对基于用户名/密码信息/角色信息的管理控制,在Glue中定义了基本域(BasicRealm)、Acl域( AcIRealm)和JAAS域三种域,分别定义了不同级别的用户/角色类型,来控制客户端用户对资源的访问,这里采用了Acl域模式来实现访问控制。系统启动的时候会初始化域信息,域信息保存在一个特定的文件中,Ad域的成员信息保存在acl. xml文件中,这个文件保存在\youwebapp/WEB - lNF/security/目录下面。
这里Glue使用访问控制结合共享密钥加密的机制来实现加密解密方案。在客户端必须是一个存在于Acl域的成员来访问服务器端的资源,在域成员中定义了共享密钥的值。< reference>标签中的内容控制对消息体进行加密,标明为soap:Envclope/soap; Body/。则表示对SOAP Body进行解密,来自客户端的加密请求通过消息处理器解析后,在服务器端利用Triple DES算法生成的对称密钥对密文进行解密操作。
五、移动电子拍卖系统客户端安全实现
1、实现方案
要在无线设备上面实现签名和加密方案,在技术实现上将会遇到很多困难,和传统的有线网络上的方案相比有很大的不同。在本系统客户端要实现加密和签名应用,需要综合考虑下面几个因素:密钥的存储。SOAP消息的提取和解析,SOAP消息的封装和发送,算法的选择。
2、J2ME客户端和Web服务交互
系统采用KSOAP的支持来处理底层的SOAP消息,在J2ME CVeb Service规范出现之前。要在J2ME客户端使用Web服务,一般通过两种方式:一是用Servlet作代理,二是用KSOAP在MIDlet中直接访问Web服务。本系统应用KSOAP对SOAP消息进行解析和封装。在无线设备上利用KSOAP调用Web服务的方法如下:
//创建—个新的SOAP请求消息
So.pObjcct mcthod=ncw SoapObject
(“you rNamespace“,¨newUser¨);
//添加方法的参数
mcthod.addProperty(”newUserParam。
userName: pas.word: 12345;
//创建一个连接对象
transport. HttpTranspart transport=
new kswp.trinsport.HttpTransport(”http: //localhost: 8004/glue/services/User”,”);
//调用的到返回结果
Object result=tnrnsport,Call( transport,method);
3、加密引擎的实现
客户端对未发送的SOAP消息进行加密,重新构造一个加密的SOAP消息。首先从SOAP请求中得到将要发送的请求SOAP消息,获取SOAP消息的方法如下:
//创建一个SOAP消息对象
SoapObject method=new SoapObject
(”yourN arnespace”,“newUser");
method. addProperty(”newUserPamm”,”hhh: hhh: 12345”);
//利用砸写的HrtpTransport类建立连接
ksoMp. tnnspart.HttpTransport tnnspmt=new ksoap. tnnspon. HttpTmmpot
H http: //star: 8004/glue/services/User;
系统提供了KsoapUtils类,在其中提供了一个8ecureCall方法,利用这个方法替代正常的Call调用,使得发送的SOAP消息在服务器端能够被验证和解密。
在应用通过HttpTransport连接调用远程服务之前,需要产生SOAP请求消息并加密SOAP Body。
4、签名引擎的实现
对原始SOAP消息实现签名,首先要处理SOAP消息的摘要。产生消息摘要的方法如下,这里使用的产生消息摘要的算法是SHA1算法。
用于签名的私钥在应用中已经被重新构建,所以可以直接使用其对消息签名。签名的方法如下:
tatic public Strin8 SetSignturc(SmnS bodyXml)
{
SHAIDigest diSe8tFric=new SHAIDige.t();
RSASiBUtil ru=new RSASiSUtil();
digeatFac=(SHAIDige8t)ru.getDigest( bodyXml);
RSAEnOne rsaFnc=ncw RSAEnginc();
PSSSigncr 8igner - ncw PSSSigner
(rsrLFaC.dige8th,c.64);
iigner. init( tnje, privKey):
byte[]8igned=8igner. genenueSigiature);
Smrigre8ult=ncw Stnn8( Bue64.cncode(8igned));
rltrirri TC8Ult;
}
小知识之SOAP简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。