1.版权声明
本文是关于如何通过序列号来加载加密的class文件的阐述。
本文所提及的resin hessian是caucho公司的注册产品名称, 其版权规caucho所有。
本文可以转载, 但是必须注明作者的blog地址:
http://blog.csdn.net/oldjavaman
2. 本文的适用对象
作为技术人员,本文的技术细节涉及到java语言的基础知识, 您在阅读前应该了解java动态装载class的机制,以及常规的java加密的相关知识, 同时本文假定您已经具有开发web的基本能力, 了解jsp和servlet的运作过程。
3.怎样阅读
你可以在下面地址下载到本文所用到的jar文件和加密工具
http://www.collegesoft.com.cn/download/licenceclient_1.0.3.jar
加密工具的下载:
http://www.collegesoft.com.cn/download/encryption.exe
关于序列号的生成部分, 鉴于保护公司产品的考虑就不再公开发布了, 有兴趣的同仁可以用mail和我交流。
4. 概述
4.1. 加密java源码的原因
java源代码经过编译以后在jvm中执行。由于jvm界面是完全透明的,java类文件能够很容易通过反编译器重新转换成源代码。因此,所有的算法、类文件等都可以以源代码的形式被公开,使得软件不能受到保护,为了保护产权,一般可以有以下几种方法:
(1)"模糊"类文件,把文件的名称和方法换成000oooo的方式,当然只要你有足够的耐心, 将这些编码转换成自己可以看懂的代码, 并非难事。
(2)流行的加密工具对源文件进行加密,比如pgp(pretty good privacy)或gpg(gnu privacy
guard)。这时,最终用户在运行应用之前必须先进行解密。但解密之后,最终用户就有了一份不加密的类文件,这和事先不进行加密没有什么差别。
(3)加密类文件,在运行中jvm用定制的类装载器(class
loader)解密类文件。java运行时装入字节码的机制隐含地意味着可以对字节码进行修改。jvm每次装入类文件时都需要一个称为
classloader的对象,这个对象负责把新的类装入正在运行的jvm。jvm给classloader一个包含了待装入类(例如
java.lang.object)名字的字符串,然后由classloader负责找到类文件,装入原始数据,并把它转换成一个class对象。
用户下载的是加密过的类文件,在加密类文件装入之时进行解密,因此可以看成是一种即时解密器。由于解密后的字节码文件永远不会保存到文件系统,所以窃密者很难得到解密后的代码。
由于把原始字节码转换成class对象的过程完全由系统负责,所以创建定制classloader对象其实并不困难,只需先获得原始数据,接着就可以进行包含解密在内的任何转换。
4.2. java密码体系和java密码扩展
java密码体系(jca)和java密码扩展(jce)的设计目的是为java提供与实现无关的加密函数api。它们都用factory
方法来创建类的例程,然后把实际的加密函数委托给提供者指定的底层引擎,引擎中为类提供了服务提供者接口在java中实现数据的加密/解密,是使用其内置
的jce(java加密扩展)来实现的。java密码体系结构支持供应商的互操作,同时支持硬件和软件实现。
4.3. 本文采用的方式
我们采用的是第三种方式, 将class文件加密作为产品的发行版本,但是为了让这个加密的方式可以在不同的项目里面使用, 又将这个解密的处理做成webservice的方式来进行.
5. 基本设计思想
这个过程可以划分成5个部分:
1) 将加密的class文件传递到webservice里面.
2) 由webservice来查看licence是里面, 是否有合法的信息, 譬如产品名称, 版本, 授权用户,已经过期时间等, 有此决定是否继续执行第3个步骤
3) 如果一切验证通过, 将由webservice返回一个解密的文件
4) 由本地的webservice来装载这个class对象,
5) 构造成一个class的instance
6.那个文件应该被加密
在以前, 尝试将自己的api进行加密, 但是作为api本身在公司内部发行,
这就要求我们每个programmer在编写代码的时候必须人手一个licence才可以进行正常的工作, 为api的升级和维护也带来极大的不便,
为什么? 因为api不能作为一个jar发布, 只能以class的方式来发布.
那么. 我们应该加密的是什么呢? 在我们设计web程序的时候, 一般的流程是, login
然后在session或cookie里面记录他的身份信息, 譬如她是一个什么样的用户, 是学生或者教师还是管理员, 同时,
我们要记录他具有什么权限, 每个权限的操作范围又是什么? 那么这个过程我们一般在用户登陆, 和数据库连接之后来进行的,
这是一个复杂的逻辑操作过程,, 加密这个方法是一个好的想法, 这样恶意的用户, 即使把所有的其他class文件用jad来还原, 也无济于事,
除非他可以猜出你在login的时候到底做了什么。
7. 怎样加密自己的java文件
7.2. 文件的加密
加密我们的文件, 我们采用的是jce的算法来进行的, 具体的加密实现, 我再次不再叙述, 在google里面,
你可以获取n多的文章在描述这个jce的用法, 对于我们的文件,
已经提供了一个windows的exe程序来之行,这个文件叫做encryption.exe
你可以用如下命令来加密自己的文件
c:> encryption –encrypto myclass.class
|
这样就可以把你的文件做成jad等工具无法反编译的文件了。
8. 从licencecenter获取的产品信息
无论再添加课程还是, 建立新的用户的时候, 您都可能会有一个需求, 我怎么知道自己的产品授权给这个用户什么样的信息呢, 是否允许他再建立一个课程或者添加一个客户?
我们提供的jar里面可以解决你的困惑:
代码如下
licencefactory licencefactory=new licencefactory();
licencefactory.getlicence("urproductname");
|
如果这个产品在验证中心没有注册序列号, 将返回null;
9.程序需要增加什么配置
在licenceclient里面, 系统需要读取licencecenter的地址, 在您的web应用发布的时候, 必须将webservice的地址编写成环境变量, 在web.xml里面增加一段代码:
<env-entry>
<env-entry-name>licence_service_url</env-entry-name>
<env-entry-value>http://192.168.2.212:8080/licencecenter/licenceservice</env-entry-value>
<env-entry-type>java.lang.string</env-entry-type>
</env-entry>
|
你可以将红色的部分放在你的web server上访问, 假设看到如下界面, 表示验证中心已经安装成功
10.关于验证中心的安装
验证中心的安装文件为 licenceservice1.0.1.zip
在你的操作系统里面解压在一个目录中。
在你的java web server里面配置一个应用, 譬如叫做:licencecenter
以resin为例子:在httpd.conf里面加上一下代码:
<web-app id="demo" app-dir="e:/licencescenter/webapp">
<servlet-mapping url-pattern=*.jsp
servlet-name=com.caucho.jsp.jspservlet/>
</web-app>
|
其中在你的这个应用中的web.xml文件必须包含
<servlet servlet-name="licenceservice" servlet-class="com.caucho.hessian.server.hessianservlet">
<init-param service-class="com.collegesoft.licence.licenceservice"/>
<init-param api-class="com.collegesoft.licence.licenceservicestub"/>
</servlet>
<servlet-mapping url-pattern="/licenceservice" servlet-name="licenceservice"/>
|
11. 常见问题
q: 为什么不直接在webservice里面加载好一个class, 而是要在客户端来用classloader来装载?
a: 很多的程序员问过我这个问题,其实很简单, 你如果知道classloader的机制,
就知道假设你扩展login的实例用到你的另外一个对象, 譬如onlineuser, 那么要在webservice里面来装载你的类,
我就必须拥有你这个类, 但是webservice里面是不知道你未来是要用到什么类的。
q:为什么在redhat9上,访问验证中心会出现中文乱码问题?
a:是由于redhat9的默认字符集不为gbk的缘故。一般采用将命令export lang=zh_cn.gbk加在resin服务启动文件中。
分享到:
相关推荐
在Java编程环境中,许可证(Licence)控制是一个重要的实践,特别是在商业软件开发中,用于确保软件的合法使用和防止非法复制。本示例将聚焦于如何在Java中实现许可证管理功能,通过`KeyGenerater`类和JUnit测试来...
而“ORCAD_10.3_Licence生成程序”正是为了解决这一问题而设计的工具。通过这个生成器,用户可以自动生成适用于ORCAD 10.3的新LICENSE.DAT文件,以替代原有的过期文件。 使用Licence生成程序的过程一般包括以下几个...
总的来说,"licence-reco.zip"项目展示了Pyqt5在GUI设计中的应用,OpenCV在车牌识别中的强大功能,以及TCP通信在数据交换中的关键作用。通过实际操作,学生不仅加深了对这些技术的理解,还锻炼了综合运用和解决问题...
这些IP核是预设计的硬件模块,如数字信号处理器(DSP)、存储器接口、PCIe控制器等,能够加速设计进程。 许可证通常有不同等级,例如免费的WebPACK版本、带有限制的试用版以及全功能的商业版。许可证文件中会明确列...
EDU LICENCE注册生成软件是针对使用JFLASH烧录程序的教育版(EDU版)用户设计的一个解决方案。在IT领域,"EDU"通常代表教育版,这种版本的软件通常提供给学术机构或学生使用,价格相对较低,但可能在功能上受到一定...
《CTBS 5.0.3 Licence 与 Access 对照参考代码详解》 在IT行业中,软件授权和数据库管理是两个至关重要的...同时,这也反映了软件设计中关于授权和权限控制的复杂性,需要兼顾灵活性和安全性,以满足各种业务需求。
图标字体是一种将矢量图形作为字体处理的技术,允许开发者通过CSS样式控制图标的大小、颜色和变形,同时保持图像在不同分辨率下的清晰度。在JavaScript项目中,使用图标字体可以方便地整合和管理大量的图标资源,...
本文将详细解析“HP Quality Center 10 licence.rar”这一压缩包中的核心知识点,帮助用户理解和使用该工具。 首先,我们关注的重点是“qc10.0_license.txt”文件,这个文件包含了关于HP Quality Center 10的授权...
市面上软件产品常用的license机制主要为以下几种:对运行的设备进行限制、对用户数进行限制、对使用时间...软件系统取得用户输入的注册码内容,通过公钥进行解密,得到用户信息,从而实现对系统的使用进行有效的控制。
"ad6.9 licence"指的是Altium Designer 6.9版本的许可证,这是一款广泛使用的电子设计自动化(EDA)工具,专门用于电路板设计和硬件开发。Altium Designer集成了电路原理图设计、PCB布局、仿真、制造输出等多个功能...
Xilinx Vivado的许可证是控制用户能否使用其高级功能、以及可以使用哪些特定器件的关键。一个有效的许可证通常包括对特定产品版本、功能模块和器件系列的授权。 “资源破解 licence xlinx vivado”这个描述可能指的...
总的来说,Vivado 2018.3 版本的licence文件是设计者进行FPGA或SoC项目的关键,它解锁了软件的全部功能,使设计者能够在完整的功能集下进行开发工作。通过理解和正确使用这个许可证,可以充分利用Vivado的强大功能,...
Licence管理通常涉及到软件的授权和权限控制,对于企业级应用而言,确保合法使用和防止非法复制是非常重要的。开发者可能需要集成特定的授权服务或者使用开源的授权库来实现这一功能。 结合这些组件,我们可以创建...
在ETF-2013-SI-Licence项目中,团队成员可能包括项目经理、系统分析师、Java程序员、数据库管理员和UI设计师等角色,他们通过协同工作,共同完成项目的各个阶段,从需求分析、设计、编码到测试和维护。 项目文件名...
在IT行业中,LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种强大的图形化编程环境,主要用于创建数据采集、测量和控制应用程序。在这个特定的压缩包"cpu_id.rar_labview CPU_labview cpu id...
【标题】"吉日嘎拉 走火入魔通用权限设计源码下载"所涉及的知识点主要集中在通用权限管理系统的实现上,这通常包括角色、用户、资源、操作等核心概念,以及权限的分配、检查和控制。下面将详细阐述这些关键知识点。 ...
### 访问安全模块设计书(通用设计) #### 一、访问安全信息 **1.1 访问安全构造** ...以上是访问安全模块设计书的核心内容概述,通过这些内容可以帮助读者更好地理解如何构建一个安全可靠的访问控制系统。
VisualSVN是一款强大的Subversion(SVN)客户端插件,专为Visual Studio设计。这款5.1.9版本是针对Visual Studio 2015及以下版本的适配,允许开发者在开发环境中直接进行版本控制操作,提高了软件开发团队的协作效率...
Lattice Diamond是Lattice Semiconductor公司推出的一款强大的FPGA开发工具,广泛应用于各种嵌入式系统、通信网络、工业控制等领域。本篇文章将详细介绍“licensecsdn1.zip”压缩包及其内容,它是Lattice Diamond ...
自平衡小车 在本文中,我们将探讨自平衡小车相关的知识点,并从给定的文件中提炼出重要的信息。 1. PID 控制 ...这些知识点都是自平衡小车的核心技术之一,对于自平衡小车的设计和实现非常重要。