转载自:http://infinite.iteye.com/blog/238064

中国是个盗版软件横行泛滥的国度,也许这里面有我们社会主义初级阶段这个国情的因素,我们确实离不开盗版软件。但要发展壮大本国的软件产业,知识产权保护亟需重视起来。除了寄希望于大环境方面的改善,我们自己也可以做些力所能及的事情,保护好自己的软件产品,以免自己的辛勤劳动成果被他人轻松窃取。

通常可以通过license机制来保护软件产品的安全,我们可以限定只有购买了license的用户在特定的机器上使用我们的软件。

我设想的license机制有以下的主要功能点:

Ø         应用程序可以创建以及验证绑定给用户、系统等实体的license。

Ø         防止用户随意拷贝软件和license。

Ø         licenses可以是永久性的或者临时性的(在某个特定时期内有效)

Ø         licenses的验证由JAVA Security API提供的数字签名机制来实现。

Ø         license安装模块需要用特殊机制对其进行保护,以防被反编译轻易破解。

1  定义license的文件格式

License文件采用普通java properties文件的定义格式。

文件中定义了产品、版本、Mac地址、license类型、license有效期等信息。如下所示:

Product.name=cpu

Product.version=3.2

License.type=Commercial

License.expiry=2010-05-12

Server.macaddress=00-1B-77-2C-9D-8F

signature=302d0215008b4ef2390e11d28f5ea7b86f71ba5168bfeaa6b402146c77706b985be68cc515

c6079b31ad50e3f17552

其中最下面一串数据为根据上面几项基本信息签名产生的注册号。

2  创建以及验证license

以下是部分实现代码(篇幅问题,只好只粘方法说明):

/** 生成公钥、私钥对。公钥公开,注意保管好私钥(如果泄露,则有可能被hacker随意创建license) */

public static void generateKey() throws Exception;

/** 用私钥对license进行数据签名*/

public static synchronized void sign(License license) throws Exception ;

/**

* 验证license是否合法。

* 首先验证Mac地址是否有改变,有的话则非法。(防止用户自由拷贝软件)。

* 然后根据公钥验证签名是否合法。*/

boolean validate(License license) throws Exception ;

然后通过以下三步可以完成整个license的创建以及验证:

// 第一步:生成公钥、私钥对。公钥公开,注意保管好私钥(如果泄露,则有可能被随意创建license)。

LicenseFactory.generateKey();

// 第二步:根据产品、版本、Mac地址、有效期等信息,签名产生注册号,并将该注册号复制到license中。

License license = License.fromConfigFile("cpu.license");

LicenseFactory.sign(license);

FileHelper.writeFile(new File(LicenseFactory.LICENSE_DIR + "/cpu.license"), license.toString());

// 第三步:利用公钥对license进行合法性验证。可以在软件代码的重要模块中加入下面的验证,比如登录模块

LicenseManager.getInstance().validate (license);

3  加强license机制实现模块的安全性

基于Java软件产品一般都是由编译文件.class组成的发布包,源代码很容易被诸如JAD之类的工具反编译出来,据此hacker们可以很轻松的重新实现部分代码来跳过license验证。

签于此,我们可以在编译或者类装载环节下些功夫,尽量增加被破解的难度。目前有多种工具可以帮助我们在编译JAVA文件的时候进行混淆,使得反编译出来的代码可读性很差,难以理解。至于类装载环节,可以对编译生成的class文件进行加密,然后通过自己定制的类装载器classLoader来装载。但这样的实现也并非无懈可击,类装载器本身也是Java文件,破解了类装载器也就破解了解密的过程,hacker还是能够反编译出源代码。所以说,这些做法只是尽可能的增加被破解难度,还是无法真正杜绝被破解。

另外Mac地址部分的实现也存在漏洞,据说现在有不少软件可以修改Windows、Unix下的机器的Mac地址(也许不是真正的修改,只是干扰我们调用ipconfig /all 或者 ifconfig等命令读取Mac地址的时候,读取的是这些软件设定的Mac地址)。对这方面还不是很了解。

以上是我的一些实现思路和方法,权当抛砖引玉,欢迎大家拍转。个人邮箱 : lovejava@163.com。

利用license机制来保护Java软件产品的安全相关推荐

  1. true在java_使用truelicense实现用于JAVA工程license机制

    使用truelicense实现用于JAVA工程license机制(包括license生成和验,有需要的朋友可以参考下. 开发的软件产品在交付使用的时候,往往会授权一段时间的试用期,这个时候licens ...

  2. java工程license机制_使用truelicense实现用于JAVA工程license机制(包括license生成和验证)...

    开发的软件产品在交付使用的时候,往往会授权一段时间的试用期,这个时候license就派上用场了.不同于在代码中直接加上时间约束,需要重新授权的时候使用license可以避免修改源码,改动部署,授权方直 ...

  3. java license 验证方案_truelicense实现JAVA的license机制(包括license生成和验证)

    原文来自:http://blog.csdn.net/luckymelina/article/details/22870665 开发的软件产品在交付使用的时候,往往会授权一段时间的试用期,这个时候lic ...

  4. java license机制dll_(转)使用truelicense实现用于JAVA工程license机制(包括license生成和验证)...

    开发的软件产品在交付使用的时候,往往会授权一段时间的试用期,这个时候license就派上用场了.不同于在代码中直接加上时间约束,需要重新授权的时候使用license可以避免修改源码,改动部署,授权方直 ...

  5. java判断对象无数据_java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值...

    1.java利用反射机制判断对象的属性是否为空: Map validateMap = new LinkedHashMap(); validateMap.put("serial", ...

  6. java 反射 单例类_利用反射机制破坏单例模式

    简介 利用反射机制破坏了单例模式,这里以懒汉单例模式为例子进行操作. 之前利用反射也是改变了类中的private变量. 类中的private变量真的private么? 正常的单例模式的实现 这里采用了 ...

  7. java 反射修改final变量_Java中final的属性值怎么利用反射机制进行修改

    Java中final的属性值怎么利用反射机制进行修改 发布时间:2020-12-02 17:31:07 来源:亿速云 阅读:96 作者:Leah 今天就跟大家聊聊有关Java中final的属性值怎么利 ...

  8. 使用 Acegi 保护 Java 应用程序

    第 1 部分: 架构概览和安全过滤器 Acegi Security System 是一种功能强大并易于使用的替代性方案,使您不必再为 Java 企业应用程序编写大量的安全代码.虽然它专门针对使用 Sp ...

  9. 阿提拉公司 java_Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python...

    Atitit 文件上传 架构设计 实现机制 解决方案 实践 java php c#.net js javascript c++ python 1 . 上传的几点要求 2 1 .1. 本地预览 2 1 ...

最新文章

  1. 路由器和交换机的综合实验
  2. 对抗攻击公开课第二弹来啦,真题演练 + 代码实战
  3. 第一次打开Lightroom时的基本设置
  4. spring data jpa update
  5. setuptools include_package_data
  6. 【每日算法Day 108】一道简单的二叉树题目,写法还是挺多的。
  7. 【网摘】ActiveX组件及其注册
  8. qt 串口助手_新手如何从零开发ROS小车 (ros串口通讯、PID运动控制、双轮差速模型解算...
  9. Windows下Redis-Cluster伪集群搭建
  10. 【机器学习】偏差-方差分解Bias-variance Decomposition
  11. 设计和实现一款轻量级的爬虫框架
  12. 【GNSS】GREAT多频多系统GREAT-UPD开源代码-第三章 中间及结果文件格式
  13. HDU 5519(Kykneion asma-NNT+CRT)
  14. go io 包的使用(TeeReader, MultiReader, MultiWriter, Pipe)
  15. AB罗克韦尔plc指示灯详解
  16. JAVA(一)依赖注入的简单理解
  17. 华为nova8pro鸿蒙系统怎么看,华为nova8的隐藏功能_华为nova8隐藏功能怎么开启
  18. slope one predictors
  19. 【渝粤题库】陕西师范大学200551 英语语音
  20. 湖仓一体(Lakehouse)是什么?

热门文章

  1. ORACLE中的MERGE语法使用记录
  2. SaltStack部署
  3. django【orm操作】
  4. Fiddler插件开发 - 实现网站离线浏览功能
  5. Michael Nygard on Building Resilient Systems
  6. Java开发人员必备的7大技能,每一个都必不可少
  7. rac下重做控制文件
  8. 安装java环境linux和windows
  9. Objective-C策略模式(Strategy)
  10. extjs window js引入问题