2006年11月30日星期四

软件加密锁编程技巧

  本文将介绍软件加密锁的一些编程技巧,以及软件开发者将如何编写安全可靠的代码,如何对付各种各样的加密狗破解,编写加密程序时应该尽量避免的一些问题等等。以下是全文。

  一、加密狗加密的基本原理

  开发商程序通过调用硬件加密狗的接口模块对硬件加密狗操作,硬件加密狗响应该操作并通过接口模块将相应数据返回给开发商的应用程序。开发商的应用程序可以对返回值进行判定并采取相应的动作。如果返回无效的响应,表明没有正确的狗,开发商可以将应用程序终止运行,或者让应用程序以错误的方式执行。简要示意如下:

软件加密锁编程

  二、常用的解密方法

  1、反汇编后静态分析: W32Dasm、IDA Pro

  2、用调试工具跟踪动态分析:SoftICE、TRW2000

  3、针对各种语言的反汇编工具:VB、Delphi、Java等

  4、其他监视工具:FileMon、RegMon 等

  三、如何提高加密强度

  下面,我们以Sentinel SuperPro加密锁为例,详细介绍一下使用如何在编程的过程中提高加密强度的方法。

  1、反DEBUG解密的编程方法和技巧

  访问狗之后不要立即做判断,判断狗不正确后,不要立即提示,或者不提示。开发商在程序各个部分插入校验算法的代码,用以增加程序代码的复杂性,防止解密者轻易跟踪发现全部的校验代码。校验代码插入程序的频率越高,破解难度越大,软件就越安全。

  重要的字符串不要在程序中以明文出现,应该使用算法动态生成。

  在不影响程序效率的情况下,尽量多写一些查狗的函数,彼此要有区别,使用不同的算法,多一些查狗出错的标志,让这些标志参与运算,在不同的模块中,使用不同的查狗函数。

  针对某一具体查询校验,都有三步骤组成:查询得到响应串;比较响应串和查询串是否匹配;根据校验结果执行相应的步骤。建议三个步骤要延时执行。最好将三步骤相互远离些,甚至放到不同的子程序或函数中。例如:执行“查询得到响应串”后,相隔50行执行“比较响应串和查询串是否匹配”,假如程序需要调用一个函数。那么就在这个函数里执行“执行相应的步骤”。解密者在跟踪过程中,即使发现了其中一部分程序代码,但很难发现另外两部分代码和全部三部分之间的关联。程序难于被破解。

  将加密锁返回的“响应串”作为程序中的参数使用。例如:算法单元返回“响应串”是“87611123”,而程序中需要使用“123”这个参数。程序中得到“响应串”后,将“响应串”减去“87611000”得到参数。如果解密者修改代码跳过查询校验加密锁部分,参数将是错误值,从而会使程序运行紊乱。

  程序在验证加密算法过程中,一般情况下验证数据不正确程序就会选择退出。这样一来很容易被解密者发现代码特征,跳过查询校验部分。开发商设计查询校验部分时,如果程序校验数据不正确,程序也不退出可以继续执行一些无用的操作使程序紊乱,用以隐蔽代码迷惑解密者。

  开发商的软件可能有多个模块,查狗的模块或接口不要用显而易见的名字来命名,这样会令解密者更容易找到加密点,当然也可以利用一些名字来迷惑解密者,尤其是dll,引出函数时甚至可以不用函数名。

  给查狗函数加入一定的随机性,例如,随机地执行某一API函数,或者在狗的存储区中划定一小块区域作随机读写,读写地址、读写内容、读写长度都是随机取的,这样可以很好地防止那些模拟工具。

  试用版与正式版要分开,试用版不提供的功能,代码已经删掉,使得不可能利用试用版破解得到正式版。

  在大多数情况下,破解是通过更改exe 或 dll 文件实现的,要在程序中检查exe或dll文件的完整性,即利用某种算法计算出整个文件的校验和,在程序中比较,如果文件被更改,校验和就会变化,这类算法网上有很多,可以查得到。另外,exe和dll之间要相互认证,一方面防止dll被替换,另一方面防止非法exe访问dll。

  小结:应该尽量避免的问题

  1)访问狗、做判断、提示用户写在一起

  2)重要的字符串在程序中以明文出现

  3)在狗中存放字符串,程序中读出比较

  4)调用同一函数或判断同一个全局标志查狗

  5)试用版软件同正式版软件是同一份

  6)查狗的模块或接口名字太明显

  7)程序无随机性,每次运行执行路径都一样

  8)没有检查exe 或 dll 文件的完整性,exe 和 dll 之间也没有相互认证

  2、反“监听仿真”软件保护锁的编程方法

  1)随机查询法:开发商使用SuperPro开发工具生成大量查询、响应对,如:1000 对,并在程序中使用这些校验数据。在程序运行过程中,从1000 对查询、响应对之中,随机的抽出其中一对验证SuperPro加密算法。因为,校验数据很多,每次验证加密算法使用的“查询响应对”可能不同,“监听仿真”软件即使纪录了一部分“查询响应对”,但无法纪录全部“查询响应对”。软件每次运行时,都可能使用新的查询响应校验数据,“监听仿真”软件无法响应这些新的查询。因此,“监听仿真”也就失去了模拟、仿真SuperPro软件保护锁的作用。

  2)延时法:开发商可以事先使用开发工具生成大量的校验数据,即:“查询、响应”对,比如:200000 组“查询、响应”对,开发程序过程中,开发商设计定时查询、校验加密锁的机制。在程序运行过程中,每10分钟查询并校验加密锁一次,使用过的校验数据,4年内不再重复使用。即使监听软件24小时记录数据,也需要4年才能纪录完毕。4年后,软件早已过了“热卖期”了,使用监听软件的解密者也就失去了行动意义。

  3)分组、分时法:开发商可以在程序中把查询响应对分组,比如:1200 对校验数据可分为12组,每100对一组。程序在一年中的第一月使用第一组校验数据,第二月使用第二组校验数据,以此类推。监听软件就算记录了第一月的校验数据,第二个三个月以后校验数据没有纪录,在以后的时间段软件仍然无法正常使用,从而“监听仿真”失去意义。

  4)随机噪声数据法:开发商可以在程序中随机产生查询数据,随机数据和真实数据混合在一起,监听软件即使记录了查询数据,也会被其随机性所迷惑,同时也无法仿真另一个次软件运行产生的随机数,加密软件也就无法破解。

  注:本文部分内容来源于彩虹加密锁Sentinel SuperPro的使用说明文档以及相关技术文档整理而成。

2006年11月29日星期三

软件加密狗破解思路和方法

  本文介绍的是软件加密狗破解的一般思路和方法,大家可能奇怪,昨天刚刚介绍完“软件加密锁产品评测”,怎么今天就介绍加密狗破解知识?其实做为软件开发者,研究好软件加密的确很重要,不过也很有必要多了解一些关于加密狗解密和破解的知识,加密和破解就像矛和盾一样,对于解密知识了解的越多,那么编写的加密代码就越好,要知道加密永远都比解密要容易的多,只有知己知彼,方能百战百胜。

  硬件加密锁,俗程“加密狗”,对于加密狗的破解大致可以分为三种方法,一种是通过硬件克隆或者复制,一种是通过SoftICE等Debug工具调试跟踪解密,一种是通过编写拦截程序修改软件和加密狗之间的通讯。

  硬件克隆复制主要是针对国产芯片的加密狗,因为国产加密狗公司一般没有核心加密芯片的制造能力,因此有些使用了市场上通用的芯片,破解者分析出芯片电路以及芯片里写的内容后,就可以立刻复制或克隆一个完全相同的加密狗。不过国外的加密狗就无法使用这种方法,国外加密狗硬件使用的是安全性很好的自己研制开发的芯片,通常很难进行复制,而且现在国内加密狗也在使用进口的智能卡芯片,因此这种硬件克隆的解密方法用处越来越少。

  对于Debug调试破解,由于软件的复杂度越来越高,编译器产生的代码也越来越多,通过反汇编等方法跟踪调式破解的复杂度已经变得越来越高,破解成本也越来越高,目前已经很少有人愿意花费大量精力进行如此复杂的破解,除非被破解的软件具有极高的价值。

  目前加密锁(加密狗)的解密破解工作主要集中在应用程序与加密动态库之间的通讯拦截。这种方法成本较低,也易于实现,对待以单片机等芯片为核心的加密锁(加密狗)具有不错的解密效果。

  由于加密锁(加密狗)的应用程序接口(API)基本上都是公开的,因此从网上可以很容易下载到加密狗的编程接口API、用户手册、和其它相关资料,还可以了解加密狗技术的最新进展。

加密锁

  例如,某个国内知名的美国加密狗提供商的一款很有名的加密狗,其全部编程资料就可以从网上获取到,经过对这些资料的分析,我们知道这个加密锁(加密狗)有64个内存单元,其中56个可以被用户使用,这些单元中的每一个都可以被用为三种类型之一:算法、数据值和计数器。

  数据值比较好理解,数据值是用户存储在可读写的单元中的数据,就和存储在硬盘里一样,用户可以使用Read函数读出存储单元里面的数据,也可以使用Write函数保存自己的信息到存储单元。

  计数器是这样一种单元,软件开发商在其软件中使用Decrement函数可以把其值减一,当计数器和某种活动的(active)算法关联时,计数器为零则会封闭(deactive)这个算法。

  算法单元较难理解一些,算法(algorithm)是这样一种技术,你用Query(queryData)函数访问它,其中queryData是查询值,上述函数有一个返回值,被加密的程序知道一组这样的查询值/返回值对,在需要加密的地方,用上述函数检查狗的存在和真伪。对于被指定为算法的单元,软件上是无法读和修改的,即使你是合法的用户也是如此,我理解这种技术除了增加程序复杂性以外,主要是为了对付使用模拟器技术的破解。

  此加密锁(加密狗)的所有API函数调用都会有返回值,返回值为0的时候表示成功。

  因此,破解思路就出来了,就是使用我们自己的工具(如VB、VC等)重新编写构造一个和加密狗API一样的DLL动态库文件,里面也包含Read、Write等全部API中包含的函数,使用的参量及返回值和原来的函数一样,所有函数返回零。然后对Query、Read函数进行处理,返回应用软件需要的数值即可。

  这个新的DLL文件编写成功后,直接替换掉原来的DLL文件,这时候再运行应用软件,软件访问加密狗的操作就全部会被拦截,拦截程序永远会返回正确的数据给软件,从而实现了模拟加密狗的运行。

  以上是目前破解软件加密狗(加密锁)的一些常见思路,对于这种破解,软件开发者还是有相应的一些对策的,下一回我将在《软件加密锁编程技巧》一文中具体介绍一下软件开发者将如何编写安全可靠的代码,使得这种类似的破解方法失效。

2006年11月28日星期二

国内软件加密锁产品评测

  昨天讲述的“软件加密技术和注册机制”是一些软件加密的基本概念,在中国,开发和销售软件离不开加密,因为我国的软件保护法制还不太健全,人们的法制观念也比较淡薄,盗版软件有着丰富的土壤,并且因为软件是一种非常特殊的商品,很容易复制,就其功能来讲,正版和盗版的区别很小,如果开发出来的软件不进行加密的话,那么在中国就无法销售出去,人们乐意使用盗版软件而没有一些道德罪孽感,因此软件开发商有必要使用一些加密产品来保护软件开发者的利益,防止软件被盗版。

  前文介绍的加密解决方案中,软件加密锁(俗称加密狗)是一种加密安全强度最好的加密产品,所谓加密锁,就是一个安装在计算机并口或USB口上的一种特殊硬件,应用软件通过和这个硬件的通讯来确保软件不被盗版。目前市场上流行的加密锁产品很多,有美国SafeNet的圣天诺加密锁系列、HASP、深思洛克等,下面,我就将对目前常见的硬件加密锁(加密狗)进行一些技术上的评测,供软件开发商们参考。

名称 圣天狗 Hasp HL Sentinel SuperPro
外观 圣天狗加密锁 Hasp HL加密锁 Sentinel SuperPro加密锁
供应商 美国SafeNet 以色列Aladdin 美国SafeNet
存储空间 8K 4K 112字节
加密算法 128位AES/ECC 128位AES/RSA DES
芯片 MCU芯片 独家芯片 ASIC
支持接口 USB,不支持并口 USB,不支持并口 USB和并口
稳定性 可以保存数据10年 数据保全:最小10年
存储读写: 最小1百万次
可以保存数据10年
写操作:100,000次
远程升级 支持 支持 支持
产地 美国 以色列 美国
参考价格 100-200元 100-200元 50-100元
自己宣称的特点和优势 圣天诺加密锁保持行业内最高的可靠性,硬件故障率低于万分之一。
圣天诺加密锁承诺非人为、非机械的硬件损坏, 2 年内免费更换。

并口产品独有 ASIC 芯片由 Rainbow 公司自主设计,保证硬件不可复制,拥有最高安全级。别
全新推出应用于 USB 加密锁上的 MCU 芯片技术,支持 3-DES 和 128 位 AES 加密算法,加密强度极高。

一只加密锁可以同时保护 28 个软件,对软件实行分模块的分发与控制。
以易用性为使命,圣天诺开发工具具有革命性的意义,使复杂的加密过程轻松完成
采用128位密匙的公共AES算法,具有超强的防盗版性能。

创新性融入了多层安全技术,抗调试和抗反向工程能力突出。

许可证采用数字更新,签名采用1024位的私有密钥RSA算法。

首创的应用程序封装技术,提供了: 防逆工程保护,代码混淆,防范动态调试和防调试器。

符合ISO 9001:2000认证的生产设备。

SafeNet 在 2004 年推出全新硬件的 SuperPro USB ,支持 SuperPro 7.0 的所有新增功能,更拥有 512 字节( 256 存储单元)的大容量以配合高级许可机制和高级安全应用, SuperPro USB 锁比 SuperPro 并口锁( 128 字节)多 384 字节,也就是多了 192 个存储单元。 提供更大存储空间的同时, SuperPro USB 的安全性也大大增强。它应用抗黑客技术,有效阻止对写锁密码的恶意攻击。

内置新一代 MCU 芯片,支持 USB2.0 标准 / 支持带电插拔,即插即用,通过微软 WHQL 认证,提供 128-512 字节掉电保持存储空间,提供 28-124 个独立的算法单元,提供上亿种算法选择 / 支持 3DES, AES 算法,支持分软件分模块销售模式 / 支持 AS 加密技术,内置计数器 / 内置唯一序列号,提供远程升级功能。
加密强度 圣天狗与应用程序的通讯,采用公钥加密及128-bit AES加密机制。中间层的入侵方式,如监听与仿真,驱动程序的替换等都被有效的遏止。每次应用程序和硬件锁间的通讯,都会使用一个独立的加密密钥,让黑客无法暴力破解。圣天狗包括了内部验证,可以有效地预防圣天狗被复制。 HASP HL通过仅允许当加密锁连入计算机才可以对被保护的软件进行访问读取和执行,来防止盗版和非法使用的。HASP HL集合了一个高度安全,无法渗透破解的编码引擎。运行时,被保护的软件发送一个经过编码的字符串给HASP HL, HASP HL对该字符串解码并产生一个无法仿造复制的返回值。如果从HASP HL返回的值正确, 则该应用程序可以运行。如果没有连入HASP HL或者返回值不正确,则该应用程序不能运行。 HASP HL使用国家标准技术局(NIST)制订的高级加密标准。 超强锁把复杂的软硬件技术结合在一起以防止非法发布和使用开发商软件。

当被圣天诺超强锁保护的软件运行时,程序向插在计算机上的超强锁发出查询命令。超强锁迅速计算查询并给出响应。正确的响应保证软件继续运行。如果超强锁被拔掉,程序将不能运行。
 

名称 深思洛克精锐IV 飞天诚信ROCKEY6
外观 深思洛克加密锁 飞天诚信加密锁
供应商 北京深思洛克 北京飞天诚信
存储空间 8K和32K 70K
加密算法 RSA/3DES RSA/3DES
芯片 菲利浦16位智能卡芯片 中兴通讯32位智能卡芯片
支持接口 USB,不支持并口 USB,不支持并口
稳定性 10万次擦写寿命 10万次擦写寿命
远程升级 支持 支持
产地 北京 北京
参考价格 50-100元 50-100元
自己宣称的特点和优势 芯片自锁功能——软件对芯片的访问首先由PIN码保护,PIN码的尝试次数可由软件开发商设定。当非法用户利用字典攻击的情况出现时,如果次数超过设定值以后,芯片会自我锁定,外界一切对芯片的操作均被停止。

硬件随机数发生器(白噪声技术)——用于产生高强度随机数。除对称算法生成密钥需要外,随机数在安全加密领域具有非常重要和广泛的应用,因此,硬件本身带有高强度随机数发生器对安全而言意义重大。

硬件时钟定时器——是软件计时使用、反跟踪等常用软件保护手段中必备的功能,精锐TMIV硬件中提供计时周期长达10小时的定时器,可以轻松实现上述要求。
采用中兴通讯的32位智能卡加密锁、内置C51虚拟机;自主知识产权的COS系统—FEITIAN COS;提供Keil 试用开发环境;全球唯一硬件ID与管理编码;丰富的虚拟机系统调用和开发接口,支持双精度浮点的多种数学运算;强大的文件系统管理,用户可定义多种数据类型和安全级别;方便、安全的远程升级和模块管理功能;内置计数器。

Rockey6Smart采用的是32位的智能卡芯片,浮点运算能力是目前最快的。能满足多数运算要求。

加密强度 精锐IV采用的是PHILIPS最先进的16位智能卡芯片,其达到了目前全球科技产品领域最高安全级别——EAL5+。深思洛克向用户承诺精锐系列采用的核心智能卡芯片完全能够对抗主要的芯片攻击手段,确保产品安全性。 ROCKEY6 SMART采用的中兴通讯的32位智能卡芯片,该款芯片已经通过国家密码局资质认证的,并为其编号SSX20,2005年7月,SSX20安全芯片获“中国电子信息产业集团公司科学技术进步二等奖”。

飞天的另一款产品ROCKEY4 SMART使用的是ST的进口芯片,该款芯片是通过了国际安全机构检测和认证(EAL 4+和IT SEC认证)。
 

  以上测评数据大多来源各个产品的相关介绍,我对这些数据做一些解读,以供大家参考。

  1、Sentinel SuperPro为比较老的产品,其存储空间最小,加密强度也小,其他产品为较新的产品。

  2、AES为目前公认的最强的单钥加密算法,以目前电脑运算速度,在地球灭亡之日也是无法解开128位的AES密钥。而DES为70年代的算法,超级计算机可以在数天内解开其密钥。

  3、ECC(椭圆曲线)是最新的双钥加密算法,通常认为其比70年代的RSA算法速度快,安全性高。

  4、硬件加密锁的安全性在于其芯片的安全,芯片是不可复制并且具有保密、自毁等功能,目前评测产品中除了飞天锁外所有核心芯片全部来自国外。其中深思洛克精锐IV和飞天ROCKEY 6 Smart使用的是智能卡芯片,其他为单片机芯片。

  5、美国政府基于国家安全的考虑,对中国出口的加密产品在密钥长度上进行了严格限制,例如早期出口至我国的软件产品(如IE等)采用的密钥长度为40位(40位的密钥业余玩家都可以在几天内破解),而通常认为128位的密钥才能满足军用安全的需要。中国军用企业被美国法律禁止购买美国的128位加密产品。

  6、飞天诚信的ROCKEY 6 Smart加密锁使用的是国产的深圳中兴通讯的智能卡芯片,这种加密锁的核心芯片没有进口,因此较适合政府或者军方使用。

  7、32位智能卡芯片的浮点运算速度快于16位的智能卡芯片,对于经常调用RSA等函数有很大好处。

2006年11月27日星期一

软件加密技术和注册机制

  本文是一篇软件加密技术的基础性文章,简要介绍了软件加密的一些基本常识和一些加密产品,适用于国内软件开发商或者个人共享软件开发者阅读参考。

  1、加密技术概述

  一个密码系统的安全性只在于密钥的保密性,而不在算法的保密性。

  对纯数据的加密的确是这样。对于你不愿意让他看到这些数据(数据的明文)的人,用可靠的加密算法,只要破解者不知道被加密数据的密码,他就不可解读这些数据。

  但是,软件的加密不同于数据的加密,它只能是“隐藏”。不管你愿意不愿意让他(合法用户,或 Cracker)看见这些数据(软件的明文),软件最终总要在机器上运行,对机器,它就必须是明文。既然机器可以“看见”这些明文,那么 Cracker,通过一些技术,也可以看到这些明文。

  于是,从理论上,任何软件加密技术都可以破解。只是破解的难度不同而已。有的要让最高明的 Cracker 忙上几个月,有的可能不费吹灰之力,就被破解了。

  所以,反盗版的任务(技术上的反盗版,而非行政上的反盗版)就是增加 Cracker 的破解难度。让他们花费在破解软件上的成本,比他破解这个软件的获利还要高。这样 Cracker 的破解变得毫无意义——谁会花比正版软件更多的钱去买盗版软件?

  2、密码学简介

  2.1   概念

  (1) 发送者和接收者

  假设发送者想发送消息给接收者,且想安全地发送信息:她想确信偷听者不能阅读发送的消息。

  (2) 消息和加密

  消息被称为明文。用某种方法伪装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密。

  明文用M(消息)或P(明文)表示,它可能是比特流(文本文件、位图、数字化的语音流或数字化的视频图像)。至于涉及到计算机,P是简单的二进制数据。明文可被传送或存储,无论在哪种情况,M指待加密的消息。

  密文用C表示,它也是二进制数据,有时和M一样大,有时稍大(通过压缩和加密的结合,C有可能比P小些。然而,单单加密通常达不到这一点)。加密函数E作用于M得到密文C,用数学表示为:

  E(M)=C.

  相反地,解密函数D作用于C产生M

  D(C)=M.

  先加密后再解密消息,原始的明文将恢复出来,下面的等式必须成立:

  D(E(M))=M

  (3) 鉴别、完整性和抗抵赖

  除了提供机密性外,密码学通常有其它的作用:.

  (a) 鉴别

  消息的接收者应该能够确认消息的来源;入侵者不可能伪装成他人。

  (b) 完整性检验

  消息的接收者应该能够验证在传送过程中消息没有被修改;入侵者不可能用假消息代替合法消息。

  (c) 抗抵赖

  发送者事后不可能虚假地否认他发送的消息。

  (4) 算法和密钥

  密码算法也叫密码,是用于加密和解密的数学函数。(通常情况下,有两个相关的函数:一个用作加密,另一个用作解密)

  如果算法的保密性是基于保持算法的秘密,这种算法称为受限制的算法。受限制的算法具有历史意义,但按现在的标准,它们的保密性已远远不够。大的或经常变换的用户组织不能使用它们,因为每有一个用户离开这个组织,其它的用户就必须改换另外不同的算法。如果有人无意暴露了这个秘密,所有人都必须改变他们的算法。

  更糟的是,受限制的密码算法不可能进行质量控制或标准化。每个用户组织必须有他们自己的唯一算法。这样的组织不可能采用流行的硬件或软件产品。但窃听者却可以买到这些流行产品并学习算法,于是用户不得不自己编写算法并予以实现,如果这个组织中没有好的密码学家,那么他们就无法知道他们是否拥有安全的算法。

  尽管有这些主要缺陷,受限制的算法对低密级的应用来说还是很流行的,用户或者没有认识到或者不在乎他们系统中内在的问题。

  现代密码学用密钥解决了这个问题,密钥用K表示。K可以是很多数值里的任意值。密钥K的可能值的范围叫做密钥空间。加密和解密运算都使用这个密钥(即运算都依赖于密钥,并用K作为下标表示),这样,加/解密函数现在变成:

  EK(M)=C

  DK(C)=M.

  DK(EK(M))=M.

  有些算法使用不同的加密密钥和解密密钥,也就是说加密密钥K1与相应的解密密钥K2不同,在这种情况下:

  EK1(M)=C

  DK2(C)=M

  DK2 (EK1(M))=M

  所有这些算法的安全性都基于密钥的安全性;而不是基于算法的细节的安全性。这就意味着算法可以公开,也可以被分析,可以大量生产使用算法的产品,即使偷听者知道你的算法也没有关系;如果他不知道你使用的具体密钥,他就不可能阅读你的消息。

  密码系统由算法、以及所有可能的明文、密文和密钥组成的。

  基于密钥的算法通常有两类:对称算法和公开密钥算法。下面将分别介绍:

  2.2   对称密码算法

  对称算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加/解密密钥是相同的。这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加/解密。只要通信需要保密,密钥就必须保密。

  对称算法的加密和解密表示为:

  EK(M)=C

  DK(C)=M

  对称算法可分为两类。一次只对明文中的单个比特(有时对字节)运算的算法称为序列算法或序列密码。另一类算法是对明文的一组比特亚行运算,这些比特组称为分组,相应的算法称为分组算法或分组密码。现代计算机密码算法的典型分组长度为64比特——这个长度大到足以防止分析破译,但又小到足以方便使用(在计算机出现前,算法普遍地每次只对明文的一个字符运算,可认为是序列密码对字符序列的运算)。

  2.3   公开密码算法

  公开密钥算法(也叫非对称算法)是这样设计的:用作加密的密钥不同于用作解密的密钥,而且解密密钥不能根据加密密钥计算出来(至少在合理假定的长时间内)。之所以叫做公开密钥算法,是因为加密密钥能够公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息。在这些系统中,加密密钥叫做公开密钥(简称公钥),解密密钥叫做私人密钥(简称私钥)。私人密钥有时也叫秘密密钥。为了避免与对称算法混淆,此处不用秘密密钥这个名字。

  用公开密钥K加密表示为

  EK(M)=C.

  虽然公开密钥和私人密钥是不同的,但用相应的私人密钥解密可表示为:

  DK(C)=M

  有时消息用私人密钥加密而用公开密钥解密,这用于数字签名(后面将详细介绍),尽管可能产生混淆,但这些运算可分别表示为:

  EK(M)=C

  DK(C)=M

  当前的公开密码算法的速度,比起对称密码算法,要慢的多,这使得公开密码算法在大数据量的加密中应用有限。

  2.4   单向散列函数

  单向散列函数 H(M) 作用于一个任意长度的消息 M,它返回一个固定长度的散列值 h,其中 h 的长度为 m .

  输入为任意长度且输出为固定长度的函数有很多种,但单向散列函数还有使其单向的其它特性:

  (1) 给定 M ,很容易计算 h ;

  (2) 给定 h ,根据 H(M) = h 计算 M 很难 ;

  (3) 给定 M ,要找到另一个消息 M‘ 并满足 H(M) = H(M’) 很难。

  在许多应用中,仅有单向性是不够的,还需要称之为“抗碰撞”的条件:

  要找出两个随机的消息 M 和 M‘,使 H(M) = H(M’) 满足很难。

  由于散列函数的这些特性,由于公开密码算法的计算速度往往很慢,所以,在一些密码协议中,它可以作为一个消息 M 的摘要,代替原始消息 M,让发送者为 H(M) 签名而不是对 M 签名 .

  如 SHA 散列算法用于数字签名协议 DSA中。

  2.5   数字签名

  提到数字签名就离不开公开密码系统和散列技术。

  有几种公钥算法能用作数字签名。在一些算法中,例如RSA,公钥或者私钥都可用作加密。用你的私钥加密文件,你就拥有安全的数字签名。在其它情况下,如DSA,算法便区分开来了??数字签名算法不能用于加密。这种思想首先由Diffie和Hellman提出 .

  基本协议是简单的 :

  (1) A 用她的私钥对文件加密,从而对文件签名。

  (2) A 将签名的文件传给B.

  (3) B用A的公钥解密文件,从而验证签名。

  这个协议中,只需要证明A的公钥的确是她的。如果B不能完成第(3)步,那么他知道签名是无效的。

  这个协议也满足以下特征:

  (1) 签名是可信的。当B用A的公钥验证信息时,他知道是由A签名的。

  (2) 签名是不可伪造的。只有A知道她的私钥。

  (3) 签名是不可重用的。签名是文件的函数,并且不可能转换成另外的文件。

  (4) 被签名的文件是不可改变的。如果文件有任何改变,文件就不可能用A的公钥验证。

  (5) 签名是不可抵赖的。B不用A的帮助就能验证A的签名。

  在实际应用中,因为公共密码算法的速度太慢,签名者往往是对消息的散列签名而不是对消息本身签名。这样做并不会降低签名的可信性。

  3    当前流行的一些软件保护技术

  3.1   序列号保护

  数学算法一项都是密码加密的核心,但在一般的软件加密中,它似乎并不太为人们关心,因为大多数时候软件加密本身实现的都是一种编程的技巧。但近几年来随着序列号加密程序的普及,数学算法在软件加密中的比重似乎是越来越大了。

  看看在网络上大行其道的序列号加密的工作原理。当用户从网络上下载某个shareware——共享软件后,一般都有使用时间上的限制,当过了共享软件的试用期后,你必须到这个软件的公司去注册后方能继续使用。注册过程一般是用户把自己的私人信息(一般主要指名字)连同信用卡号码告诉给软件公司,软件公司会根据用户的信息计算出一个序列码,在用户得到这个序列码后,按照注册需要的步骤在软件中输入注册信息和注册码,其注册信息的合法性由软件验证通过后,软件就会取消掉本身的各种限制,这种加密实现起来比较简单,不需要额外的成本,用户购买也非常方便,在互联网上的软件80%都是以这种方式来保护的。

  软件验证序列号的合法性过程,其实就是验证用户名和序列号之间的换算关系是否正确的过程。其验证最基本的有两种,一种是按用户输入的姓名来生成注册码,再同用户输入的注册码比较,公式表示如下:

  序列号 = F(用户名)

  但这种方法等于在用户软件中再现了软件公司生成注册码的过程,实际上是非常不安全的,不论其换算过程多么复杂,解密者只需把你的换算过程从程序中提取出来就可以编制一个通用的注册程序。

  另外一种是通过注册码来验证用户名的正确性,公式表示如下:

  用户名称 = F逆(序列号) (如ACDSEE)

  这其实是软件公司注册码计算过程的反算法,如果正向算法与反向算法不是对称算法的话,对于解密者来说,的确有些困难,但这种算法相当不好设计。

  于是有人考虑到以下的算法:

  F1(用户名称) = F2(序列号)

  F1、F2是两种完全不同的的算法,但用户名通过F1算法计算出的特征字等于序列号通过F2算法计算出的特征字,这种算法在设计上比较简单,保密性相对以上两种算法也要好的多。如果能够把F1、F2算法设计成不可逆算法的话,保密性相当的好;可一旦解密者找到其中之一的反算法的话,这种算法就不安全了。一元算法的设计看来再如何努力也很难有太大的突破,那么二元呢?

  特定值 = F(用户名,序列号)

  这个算法看上去相当不错,用户名称与序列号之间的关系不再那么清晰了,但同时也失去了用户名于序列号的一一对应关系,软件开发者必须自己维护用户名称与序列号之间的唯一性,但这似乎不是难以办到的事,建个数据库就可以了。当然也可以把用户名称和序列号分为几个部分来构造多元的算法。

  特定值 = F(用户名1,用户名2,...序列号1,序列号2...)

  现有的序列号加密算法大多是软件开发者自行设计的,大部分相当简单。而且有些算法作者虽然下了很大的功夫,效果却往往得不到它所希望的结果。

  3.2   时间限制

  有些程序的试用版每次运行都有时间限制,例如运行10分钟或20分钟就停止工作,必须重新运行该程序才能正常工作。这些程序里面自然有个定时器来统计程序运行的时间。

  这种方法使用的较少。

  3.3   Key File 保护

  Key File(注册文件)是一种利用文件来注册软件的保护方式。Key File一般是一个小文件,可以是纯文本文件,也可以是包含不可显示字符的二进制文件,其内容是一些加密过或未加密的数据,其中可能有用户名、注册码等信息。文件格式则由软件作者自己定义。试用版软件没有注册文件,当用户向作者付费注册之后,会收到作者寄来的注册文件,其中可能包含用户的个人信息。用户只要将该文件放入指定的目录,就可以让软件成为正式版。该文件一般是放在软件的安装目录中或系统目录下。软件每次启动时,从该文件中读取数据,然后利用某种算法进行处理,根据处理的结果判断是否为正确的注册文件,如果正确则以注册版模式来运行。

  这种保护方法使用也不多。

  3.4   CD-check

  即光盘保护技术。程序在启动时判断光驱中的光盘上是否存在特定的文件,如果不存在则认为用户没有正版光盘,拒绝运行。在程序运行的过程当中一般不再检查光盘的存在与否。Windows下的具体实现一般是这样的:先用GetLogicalDriveStrings( )或GetLogicalDrives( )得到系统中安装的所有驱动器的列表,然后再用GetDriveType( )检查每一个驱动器,如果是光驱则用CreateFileA( )或FindFirstFileA( )等函数检查特定的文件存在与否,并可能进一步地检查文件的属性、大小、内容等。

  3.5   软件狗

  软件狗是一种智能型加密工具。它是一个安装在并口、串口等接口上的硬件电路,同时有一套使用于各种语言的接口软件和工具软件。当被狗保护的软件运行时,程序向插在计算机上的软件狗发出查询命令,软件狗迅速计算查询并给出响应,正确的响应保证软件继续运行。如果没有软件狗,程序将不能运行,复杂的软硬件技术结合在一起防止软件盗版。真正有商业价值得软件一般都用软件狗来保护。

  平时常见的狗主要有“洋狗”(国外狗)和“土狗”(国产狗)。这里“洋狗”主要指美国的彩虹和以色列的HASP,“土狗”主要有金天地(现在与美国彩虹合资,叫“彩虹天地”)、深思、尖石。总的说来,“洋狗”在软件接口、加壳、反跟踪等“软”方面没有“土狗”好,但在硬件上破解难度非常大;而“土狗”在软的方面做的很好,但在硬件上不如“洋狗”,稍有单片机功力的人,都可以复制。

  3.6   软盘加密

  通过在软盘上格式化一些非标准磁道,在这些磁道上写入一些数据,如软件的解密密钥等等。这种软盘成为“钥匙盘”。软件运行时用户将软盘插入,软件读取这些磁道中的数据,判断是否合法的“钥匙盘”。

  软盘加密还有其它一些技术,如弱位加密等等。

  随着近年来软盘的没落,这种方法基本上退出了历史舞台。

  3.7   将软件与机器硬件信息结合

  用户得到(买到或从网上下载)软件后,安装时软件从用户的机器上取得该机器的一些硬件信息(如硬盘序列号、BOIS序列号等等),然后把这些信息和用户的序列号、用户名等进行计算,从而在一定程度上将软件和硬件部分绑定。用户需要把这一序列号用Email、电话或邮寄等方法寄给软件提供商或开发商,软件开发商利用注册机(软件)产生该软件的注册号寄给用户即可。软件加密虽然加密强度比硬件方法较弱,但它具有非常廉价的成本、方便的使用方法等优点。非常适合做为采用光盘(CDROM)等方式发授软件的加密方案。

  此种加密算法的优点

  ·    不同机器注册码不同。用户获得一个密码只能在一台机器上注册使用软件。不同于目前大多软件采用的注册方法,即只要知道注册码,可在任何机器上安装注册。

  ·    不需要任何硬件或软盘

  ·    可以选择控制软件运行在什么机器、运行多长时间或次数等

  ·    可让软件在不注册前的功能为演示软件,只能运行一段时间或部分功能。注册后就立即变为正式软件

  ·    采用特别技术,解密者很难找到产生注册号码的规律

  ·    在使用注册号产生软件(注册机)时可采用使用密码、密钥盘、总次数限制等方法

  ·    方便易用,价格低廉。

  这种加密还有以下特点

  1、 注册加密的软件,只能在一台机器上安装使用。把软件拷贝到其它机器上不能运行。

  2、 若用户想在另一机器上安装运行,必须把软件在这一机器上运行时的序列号,寄给软件出版商换取注册密码。当然应再交一份软件费用。

  3、 此加密方法特别适应在因特网上发布的软件及用光盘发布的软件。

  注释:

  1、“加密技术概述”部分内容参考了大学教材“密码学基础”。

  2、“当前流行的一些软件保护技术”部分内容参考了“加密与解密--软件保护技术及完全解决方案”一文。

2006年11月26日星期日

真三国无双系列游戏片头

  真三国无双系列是PS2上很少见的3D动作游戏,日本的光荣(KOEI)在2002年发布,其二代、三代、四代的销量均突破了百万套。可以说,真三国无双系列游戏是PS2游戏机上必玩的ACT经典大作。

  我对于真三国无双二代、三代、四代全部都玩通关过,因为想要收集全集,最近还买到了一代来体验一下,不过玩后的感觉是,一代和二代的差距还是非常大的。

真三国无双

  从真三国无双三代开始,我发现这个游戏的片头动画变得很精彩,非常值得品味,相信美工在上面花了不少的精力,几乎每一代的片头都给玩家一些惊喜,令整个游戏生色不少。

  三代的片头描述的是著名的赤壁大战,不到一分钟的片头足以让玩家全然融入赤壁大战那硝烟滚滚、杀声震天、刀光剑影、鼓角嘹亮的历史画卷,那磅礴的气势可谓经典。

  四代的片头算的上是历代无双系列作品中片头动画中最令人热血沸腾的一部,场景大概是著名的长板坡,赵云被刻画成一个骁勇善战和独闯曹营的虎胆英雄,面对曹操的百万雄兵,毫无惧色,以一当千,豪情万丈地杀入千军万马之间,这是何等的气魄啊。相信每个看完这个片头的玩家,玩游戏选人物时都会第一个选赵云。

  真三国无双BB是一个基于PC的网络游戏,在这个游戏中,玩家将不再扮演真实的武将,而是扮演武将的部下而参与战斗,从一个不知名的角色慢慢成长,在三国的历史长河中纵横,角色的命运由玩家自己作主。这种模式和真三国无双4猛将传的“立志模式”有点类似,玩起来也别有一番味道。

  真三国无双BB的片头也是这样的情节,描写了三个家破人亡而参军的青年,加入了著名的虎牢关的战役,并与“天下无敌”的英雄吕布一比高低,充满了个人色彩,让人感觉这是一个描写人而不是描写神的游戏,颇让人感慨万千。值得一提的是,这个片头第一次使用了中文配音,可以看得出日本光荣公司对于中国用户的关注和期望。

真三国无双

2006年11月25日星期六

提高浏览体验的五十个最佳FireFox扩展插件

  FireFox的扩展插件有成百上千,你要用哪个呢?这里收集了50个流行的扩展插件,下载后安装,会让你的FireFox浏览更轻松。请注意,大多数扩展插件可以在FireFox2.0上使用,如果无法使用,那么使用Nightly Tester Tools扩展来让他们工作。当一个新的FireFox版本发布后,这个扩展插件可以允许你轻松更新这些已经存在的扩展。

  标签页管理

  All-in-One Gestures - 多合一鼠标手势,集合了流行的滚动、导航等方位插件的鼠标手势。

  Tabbrowser Preferences - 增强式标签页浏览扩展,提供一个很全面的图形界面,以便让用户能够轻松更改Firefox中的隐藏设置,让Firefox的标签页浏览功能更加强大和完善,并提供关于链接打开方式的详细设置。

  Tab Mix Plus - 在页签上增加了更多的功能,允许你在一个页签上打开多个链接,或者在多个页签打开同一个链接,合并或者关闭同一个域名的链接等。

  Restart Firefox - 在文件菜单中加了一项“重启firefox”,在安装扩展或插件后,使用这个插件可以很方便,不用关闭FireFox。

  Sessionsaver - 恢复上一次打开的页面,如果你上次用过FireFox的话,这对于崩溃的FireFox同样有效。
 

   Duplicate Tab - 允许你在新窗口或当前窗口复制相同的页签(包括浏览历史等)。

  Colorful Tabs - 可以让打开的标签变成彩色的,使得界面美化。

  Viamatic foXpose - 在状态栏上增加一个图标,点一下就可以打开所有的页签。

  Firefox Showcase - 简化定位和选择当前窗口的操作。

  Separe - 帮助整理当前页签。

  Permatabs - 使得一个被选定的页签不能被关闭,并且永远驻留在内存。

  FaviconizeTab - 调整页签的宽度,并且只显示图标。

  网页链接管理

  Linky - 下载选中内容中的所有的网页、图像、文件链接等等。

  WebMailCompose - 让网页上的发邮件链接自动转移到web邮件的发送邮件地址。

  Linkification - 使得FireFox可以在查看纯文本的时候识别链接地址并打开链接。

  IE Tab - 使用IE内核访问网页。对于只支持IE的页面特别有用。

  FirefoxView - 在IE中使用FireFox打开当前的页面。

  Paste and Go - 让你粘贴URL到地址栏后自动打开页面,或者使用快捷键Ctrl-Shift-V。

  ErrorZilla - 修改默认的404错误页面为一个Google的缓存页面。

  文件下载管理

  FlashGot - 多线程下载工具。

  PDF Download - 提供浏览者对PDF更多的操控方式,当你点击一个PDF链接时Firefox会弹出一个对话框供你进行选择性操作:下载、在标签页打开、在新标签页中以HTML方式查看、取消。

  ScrapBook - 方便的保存与管理网页。

  DownThemAll - 只需一点即可下载网页中的所有连接。

  TargetAlert TargetAlert - 可以帮你扫描网页中的所有超链接,在符合特定文件类型的超链接后面,加上一个特定的图标,让你可以不用去看网址就可以知道这是什么类型的文件。

  Download Manager Tweak - 修改FireFox默认的下载管理器,使其可以在书签列(侧边列)或标签页中开启下载管理窗口。

  Download Statusbar - 让你可以从状态列看出目前下载文件的进度。

  Disable Targets For Downloads - 在点击链接下载文件时,防止打开新窗口。

  FireFTP - 在FireFox中实现的一个完全免费的、安全的、跨平台的FTP客户端功能。

  浏览网页管理

  GreaseMonkey - 可以安装用户自己编写的脚本,实现自定义的功能,功能强大。

  Image Zoom - 通过右键与滚轮配合使用,放大缩小图片。

  Fasterfox - 加速FireFox的启动和运行,网络性能调节与优化。

  SpellBound - 对于当前的填写的表单进行英文拼写检查。

  BugMeNot - 绕过网站设置的登录限制,直接进入浏览网页,可以免去烦琐的注册网站的过程。

  AutoCopy - 在页面上选择任何内容都会自动将其复制到剪贴板中,按中间的鼠标粘贴。

  Copy Plain Text - 无格式复制当前文本内容,将当前页面的所有字体等格式删除后复制。

  Google Images Re-Linker - 绕过Google图片搜索的框架预览页面,直接浏览里面的略缩图的大图。

  Stop-or-Reload Button - 将刷新和停止整合为一个按钮。

  Extended Statusbar - 像Opera的状态栏那样的东西,一个显示速度、进度百分比、时间和载入字节数的状态条。

  Resizeable Textarea - 可以让你调节表单文字录入框的大小,不用再不停的拖滚动条了。

  Adblock Plus - Adblock plus是Adblock的加强版。可以阻挡特定网址及网页上的广告对象(例如图片、Flash)。

  Flashblock - 阻挡所有Flash。

  Sage - 一个轻量级的RSS阅读器,在侧边栏提供一个窗口阅读RSS。

  Cacheout - 让你通过Google的缓存或者代理来访问某个页面。

  Pearl Crescent Page Saver - 截屏程序,可以将整个页面保存为一个图片。

  Reload Every - 自动去刷新某个页面。

  Copy URL+  - 能让使用者在复制网页上面选取的文字时,也同时复制网页的网址与标题。

  InFormEnter - 以半自动模式填写表单的助手。这个扩展在一个网页表单的每个输入栏加入一个能够点击的小图标,你能从这里选择条目插入——不需要键入。你能通过菜单设定,使它显示你经常用到的信息,例如名字、email、地址等等。

  All-in-One Sidebar - 在侧边栏中就可以快速切换书签、下载项和扩展等面板,或者在侧边栏登陆网站、查看源代码;另外,还有侧栏切换柄和工具栏,单击浏览器一侧的突起边缘,即可打开/关闭扩展,所有这些都允许用户自由定制

  Text size toolbar - 添加一个按钮,可以增加或者减小字体,也可以回复到默认字体。

  Reveal - 让你可以在历史记录里看到页面的缩略图,以便快速找到你需要的网页。

  Mystickies - 让你可以在Web上放一个便条纸,并使用Tag标记。

  Clear Cache Button - 在工具栏中添加一个清除缓存的按钮,单击一次即可清除历史记录。

  gTranslate - 在页面上右击即可使用Google来翻译当前网页的内容。

  Xinha Here! - 一个所见即所得的文本编辑器。

  Yoono - 即时显示建议的网址,并分享大家共同感兴趣的网址。

  BlueOrganizer - 帮你定制你的个性化信息,帮助你节省时间找到相关的信息。

  隐私与安全管理

  SwitchProxy - 让你在多个代理服务器上快速切换。

  NoScript - 只允许受信任的网站启用JavaScript、Java 或其他插件。白名单基于优先阻止机制,在不损失任何功能的情况下,阻止利用已知或未知安全漏洞的攻击。

  Always Remember Password - 让一些网站永远记住你的密码,不用再重新输入。用于对付一些总让你输密码的网站,如银行等。

  CookieCuller - 增强版本的Cookie管理器。

  Stealther - 使用浏览网页不留下任何痕迹。

  网页搜索管理

  Google Toolbar for Firefox - Google工具栏软件,可以实现多种实用的功能。

  CustomizeGoogle - 增强的Google搜索结果,添加很多附加信息,同时删除一些没用的信息(比如Google的广告等,个人觉得这样似乎不太好)。

  NextPlease - 为浏览器添加前进后退按钮,或者说是翻页按钮。

  BetterSearch - 增强Google, MSN Search, Yahoo Search, A9, Answers.com, AllTheWeb, Dogpile.com, del.icio.us and Simpy.com bookmarks等的搜索结果。

  Answers - 按住Alt键后点任何一个单词,可以得到一个快速的相关定义或者解释说明。

  音乐、视频管理

  FoxyTunes - 边上网边听歌。不用离开浏览器就可以控制你喜欢的媒体播放器。

  MediaPlayerConnectivity - 使您轻轻一按就可用外部媒体播放程序播放网页内嵌视频。

  电子邮件管理

  Gmail Manager - 用来同时管理多个GMail账号,即时显示各账号中的新邮件统计。

  Gmail Notifier - 自动检查GMail里的邮件。

  AJAX Yahoo Mail - 为Yahoo Mail加入Ajax功能,可以只用按一下,就查看邮件。

  书签管理

  Bookmark with Del.icio.us - 在FireFox中集成del.icio.us,轻松发布自己的书签而不用离开当前页面。

  Foxmarks Bookmark Synchronizer - 安装这个插件后,其会在后台自动同步当前的书签。

   StumbleUpon - 是一个让你更方便的浏览优秀网站的FireFox插件。

  Reliby - 提供一个刷新所有即时书签的功能。

  Clipmarks - 让你保存并分享页面内容而不用进入整个页面。

  其它流行服务管理

  Adsense Notifier - 在状态栏显示Adsense的收入。

  Forecastfox - 在状态栏显示天气预报。

  StockTicker - 显示你喜欢的股票状态。

  DictionarySearch - 在线词典查找单词。

  Web Developer - 网站开发者使用的工具,有很多优秀的功能。

  Performancing for Firefox - 一个Blog编辑器,让你可以轻松的在Wordpress、MovableType或者Blogger中发布文章。

  Map+ - 让你能快速查看地图中选择的地址而不用改变窗口。

  ChatZilla - 一个干净易用的IRC聊天客户端软件。

Firefox

  以上就是我所推荐的五十个优秀的FireFox扩展插件,并不是说你需要完全赞同我选择的这些扩展插件,这只是一个发现最优秀FireFox扩展插件的一个尝试,这篇文章会不断更新,如果你发现了什么更好的FireFox扩展插件,请留言告诉我。

  英文原文地址:50 Best Firefox Extensions for Power Surfing  

  中文翻译:William Long

2006年11月24日星期五

使用Axis开发Web Service程序

  今天是感恩节,差点又要在公司加班了。好在Web Service程序并不是特别难搞,下午终于在eclipse下调通过了,正确产生了服务器端和客户端的Java代码,apache的东西的确很不错。

  说道Web Service的程序开发,八个月前我加班调试公司和中国电信的商务领航系统的接口的时候,用的就是Web Service,Web Service有很多优点,使用Web Service可以在不同编程语言间实现数据交换,而我那时对Web Service也不熟,就由同事帮我生成了一大堆Web Service的框架代码,我则只单独开发业务代码。

  这次的另外一个项目也要用Web Service了,不过人手也少了,没有人帮做Web Service了,只好自己动手。

  好在开发前,有个同事先给我们不熟悉Web Service的程序员进行了一些培训,我才知道原来以前的Web Service都是可以自动生成代码的,而且也不难,试了一个下午客户端和服务器端的Web Service代码就都调试通过了,真不错。

  为了更多喜爱开发的程序员也能迅速了解Web Service的开发,我这里整理了一些通过Axis开发Web Service的一些要点,希望能让不熟悉Web Service的开发人员能够迅速掌握Web Service。

  一、Axis环境的安装

  1、安装环境 J2SE SDK 1.4,Tomcat 5.0,eclipse 3.2。

  2、到 http://xml.apache.org 网站下载Axis安装包。

  3、将Axis相关包文件放在WEB-INFlib目录下。

  4、Axis可选的包:activation.jar; mail.jar; xmlsec-1.4.Beta1.jar拷贝到WEB-INF目录下,生成客户端时候需要使用。

  Axis支持三种web service的部署和开发,分别为:

  1、Dynamic Invocation Interface (DII)

  2、Dynamic Proxy方式

  3、Stubs方式

  前两种方式我就不介绍了,同事告诉我他们自己都不使用前两种方式,他们建议我们使用Stubs方式,因此我就主要就介绍一下第三种方式。注意,我自己的Java源代码是放在D:workspace est目录下,Axis相关包文件放在D:workspace estWEB-INF目录下。

  二、编写wsdd发布web服务,编写stub client访问web服务

  1、编写服务端程序server,SayHello.java,编译server.SayHello.java

package server;
public class SayHello
{
    public String getName(String name)
    {
        return "hello "+name;
    }
}

  2、编写wsdd文件

  deploy.wsdd文件内容如下:

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <service name="SayHello" provider="java:RPC">
  <parameter name="className" value="server.SayHello.getName"/>
  <parameter name="allowedMethods" value="*"/>
 </service>
</deployment>

  3、发布服务:

  编辑一个deploy.bat,Axis_Lib为axis.jar路径。内容如下:

set Axis_Lib=D:workspace estWEB-INFlib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Axis_Servlet=http://localhost:8080/test/servlet/AxisServlet
%Java_Cmd% org.apache.axis.client.AdminClient -l%Axis_Servlet% deploy.wsdd

  执行这个批处理文件,这时候,如果提示成功的话,访问http://localhost:8080/test/services 就会显示服务列表。

  4、生成客户端client stub文件

  在浏览器上访问服务器端的服务,可以下载到WSDL文件,通过Axis的相关工具,可以自动从WSDL文件中生成Web Service的客户端代码。

  编写一个WSDL2Java.bat文件,其内容如下:

set Axis_Lib=D:workspace estWEB-INFlib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=D:workspace estsrc
set Package=server.SayHello
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% SayHello.wsdl

  执行这个批处理文件就可以生成client stub.

  生成的stub client文件列表为:SayHello.java,SayHelloService.java,SayHelloServiceLocator.java,SayHelloSoapBindingStub.java .

  5、编写客户端程序,编译并执行

  下面是一段junit测试客户端代码。

import java.net.URL;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class TestWSClient extends TestCase {

    public TestWSClient(String string) {
        super(string);
    }

    public void SayHelloClient() throws Exception {

        SayHelloService service = new SayHelloServiceLocator();
        SayHello_PortType client = service.getSayHello() ;
        String retValue = client.getName("clientname");
        System.out.println(retValue);

    }

    public static Test suite() {
        TestSuite suite = new TestSuite();
        suite.addTest(new TestWSClient("SayHelloClient"));
        return suite;
    }
}

  至此,整个服务器端和客户端的Web Service框架代码就完成了,剩下的就是在里面加入你的业务代码了,怎么样,Web Service并不难开发吧。