[b]1.版权声明[/b]
本文是关于如何通过序列号来加载加密的class文件的阐述。
本文所提及的resin hessian是caucho公司的注册产品名称, 其版权规caucho所有。
本文可以转载, 但是必须注明作者的blog地址:
http://blog.csdn.net/oldjavaman
[b]2. 本文的适用对象[/b]
作为技术人员,本文的技术细节涉及到java语言的基础知识, 您在阅读前应该了解java动态装载class的机制,以及常规的java加密的相关知识, 同时本文假定您已经具有开发web的基本能力, 了解jsp和servlet的运作过程。
[b]3.怎样阅读[/b]
你可以在下面地址下载到本文所用到的jar文件和加密工具
http://www.collegesoft.com.cn/download/licenceclient_1.0.3.jar
加密工具的下载:
http://www.collegesoft.com.cn/download/encryption.exe
关于序列号的生成部分, 鉴于保护公司产品的考虑就不再公开发布了, 有兴趣的同仁可以用mail和我交流。
[b]4. 概述[/b]
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的方式来进行.
[b]5. 基本设计思想[/b]
这个过程可以划分成5个部分:
1) 将加密的class文件传递到webservice里面.
2) 由webservice来查看licence是里面, 是否有合法的信息, 譬如产品名称, 版本, 授权用户,已经过期时间等, 有此决定是否继续执行第3个步骤
3) 如果一切验证通过, 将由webservice返回一个解密的文件
4) 由本地的webservice来装载这个class对象,
5) 构造成一个class的instance
[b]6.那个文件应该被加密[/b]
在以前, 尝试将自己的api进行加密, 但是作为api本身在公司内部发行, 这就要求我们每个programmer在编写代码的时候必须人手一个licence才可以进行正常的工作, 为api的升级和维护也带来极大的不便, 为什么? 因为api不能作为一个jar发布, 只能以class的方式来发布.
那么. 我们应该加密的是什么呢? 在我们设计web程序的时候, 一般的流程是, login 然后在session或cookie里面记录他的身份信息, 譬如她是一个什么样的用户, 是学生或者教师还是管理员, 同时, 我们要记录他具有什么权限, 每个权限的操作范围又是什么? 那么这个过程我们一般在用户登陆, 和数据库连接之后来进行的, 这是一个复杂的逻辑操作过程,, 加密这个方法是一个好的想法, 这样恶意的用户, 即使把所有的其他class文件用jad来还原, 也无济于事, 除非他可以猜出你在login的时候到底做了什么。
[b]7. 怎样加密自己的java文件[/b]
7.2. 文件的加密
加密我们的文件, 我们采用的是jce的算法来进行的, 具体的加密实现, 我再次不再叙述, 在google里面, 你可以获取n多的文章在描述这个jce的用法, 对于我们的文件, 已经提供了一个windows的exe程序来之行,这个文件叫做encryption.exe
你可以用如下命令来加密自己的文件
这样就可以把你的文件做成jad等工具无法反编译的文件了。
[b]8. 从licencecenter获取的产品信息[/b]
无论再添加课程还是, 建立新的用户的时候, 您都可能会有一个需求, 我怎么知道自己的产品授权给这个用户什么样的信息呢, 是否允许他再建立一个课程或者添加一个客户?
我们提供的jar里面可以解决你的困惑:
代码如下
licencefactory licencefactory=new licencefactory();
licencefactory.getlicence("urproductname");
如果这个产品在验证中心没有注册序列号, 将返回null;
[b]9.程序需要增加什么配置[/b]
在licenceclient里面, 系统需要读取licencecenter的地址, 在您的web应用发布的时候, 必须将webservice的地址编写成环境变量, 在web.xml里面增加一段代码:
你可以将红色的部分放在你的web server上访问, 假设看到如下界面, 表示验证中心已经安装成功
[b]10.关于验证中心的安装[/b]
验证中心的安装文件为 licenceservice1.0.1.zip
在你的操作系统里面解压在一个目录中。
在你的java web server里面配置一个应用, 譬如叫做:licencecenter
以resin为例子:在httpd.conf里面加上一下代码:
其中在你的这个应用中的web.xml文件必须包含
[b]11. 常见问题[/b]
q: 为什么不直接在webservice里面加载好一个class, 而是要在客户端来用classloader来装载?
a: 很多的程序员问过我这个问题,其实很简单, 你如果知道classloader的机制, 就知道假设你扩展login的实例用到你的另外一个对象, 譬如onlineuser, 那么要在webservice里面来装载你的类, 我就必须拥有你这个类, 但是webservice里面是不知道你未来是要用到什么类的。
q:为什么在redhat9上,访问验证中心会出现中文乱码问题?
a:是由于redhat9的默认字符集不为gbk的缘故。一般采用将命令export lang=zh_cn.gbk加在resin服务启动文件中。
文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
本文是关于如何通过序列号来加载加密的class文件的阐述。
本文所提及的resin hessian是caucho公司的注册产品名称, 其版权规caucho所有。
本文可以转载, 但是必须注明作者的blog地址:
http://blog.csdn.net/oldjavaman
[b]2. 本文的适用对象[/b]
作为技术人员,本文的技术细节涉及到java语言的基础知识, 您在阅读前应该了解java动态装载class的机制,以及常规的java加密的相关知识, 同时本文假定您已经具有开发web的基本能力, 了解jsp和servlet的运作过程。
[b]3.怎样阅读[/b]
你可以在下面地址下载到本文所用到的jar文件和加密工具
http://www.collegesoft.com.cn/download/licenceclient_1.0.3.jar
加密工具的下载:
http://www.collegesoft.com.cn/download/encryption.exe
关于序列号的生成部分, 鉴于保护公司产品的考虑就不再公开发布了, 有兴趣的同仁可以用mail和我交流。
[b]4. 概述[/b]
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的方式来进行.
[b]5. 基本设计思想[/b]
这个过程可以划分成5个部分:
1) 将加密的class文件传递到webservice里面.
2) 由webservice来查看licence是里面, 是否有合法的信息, 譬如产品名称, 版本, 授权用户,已经过期时间等, 有此决定是否继续执行第3个步骤
3) 如果一切验证通过, 将由webservice返回一个解密的文件
4) 由本地的webservice来装载这个class对象,
5) 构造成一个class的instance
[b]6.那个文件应该被加密[/b]
在以前, 尝试将自己的api进行加密, 但是作为api本身在公司内部发行, 这就要求我们每个programmer在编写代码的时候必须人手一个licence才可以进行正常的工作, 为api的升级和维护也带来极大的不便, 为什么? 因为api不能作为一个jar发布, 只能以class的方式来发布.
那么. 我们应该加密的是什么呢? 在我们设计web程序的时候, 一般的流程是, login 然后在session或cookie里面记录他的身份信息, 譬如她是一个什么样的用户, 是学生或者教师还是管理员, 同时, 我们要记录他具有什么权限, 每个权限的操作范围又是什么? 那么这个过程我们一般在用户登陆, 和数据库连接之后来进行的, 这是一个复杂的逻辑操作过程,, 加密这个方法是一个好的想法, 这样恶意的用户, 即使把所有的其他class文件用jad来还原, 也无济于事, 除非他可以猜出你在login的时候到底做了什么。
[b]7. 怎样加密自己的java文件[/b]
7.2. 文件的加密
加密我们的文件, 我们采用的是jce的算法来进行的, 具体的加密实现, 我再次不再叙述, 在google里面, 你可以获取n多的文章在描述这个jce的用法, 对于我们的文件, 已经提供了一个windows的exe程序来之行,这个文件叫做encryption.exe
你可以用如下命令来加密自己的文件
c:> encryption –encrypto myclass.class
这样就可以把你的文件做成jad等工具无法反编译的文件了。
[b]8. 从licencecenter获取的产品信息[/b]
无论再添加课程还是, 建立新的用户的时候, 您都可能会有一个需求, 我怎么知道自己的产品授权给这个用户什么样的信息呢, 是否允许他再建立一个课程或者添加一个客户?
我们提供的jar里面可以解决你的困惑:
代码如下
licencefactory licencefactory=new licencefactory();
licencefactory.getlicence("urproductname");
如果这个产品在验证中心没有注册序列号, 将返回null;
[b]9.程序需要增加什么配置[/b]
在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上访问, 假设看到如下界面, 表示验证中心已经安装成功
[b]10.关于验证中心的安装[/b]
验证中心的安装文件为 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"/>
[b]11. 常见问题[/b]
q: 为什么不直接在webservice里面加载好一个class, 而是要在客户端来用classloader来装载?
a: 很多的程序员问过我这个问题,其实很简单, 你如果知道classloader的机制, 就知道假设你扩展login的实例用到你的另外一个对象, 譬如onlineuser, 那么要在webservice里面来装载你的类, 我就必须拥有你这个类, 但是webservice里面是不知道你未来是要用到什么类的。
q:为什么在redhat9上,访问验证中心会出现中文乱码问题?
a:是由于redhat9的默认字符集不为gbk的缘故。一般采用将命令export lang=zh_cn.gbk加在resin服务启动文件中。
文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!