利⽤license机制来保护Java软件产品的安全
通常可以通过license机制来保护软件产品的安全,我们可以限定只有购买了license的⽤户在特定的机器上使⽤我们的软件。 我设想的license机制有以下的主要功能点:
Ø 应⽤程序可以创建以及验证绑定给⽤户、系统等实体的license。
Ø 防⽌⽤户随意拷贝软件和license。
Ø licenses可以是永久性的或者临时性的(在某个特定时期内有效)java源代码加密
Ø licenses的验证由JAVA Security API提供的数字签名机制来实现。
Ø license安装模块需要⽤特殊机制对其进⾏保护,以防被反编译轻易破解。
1、 定义license的⽂件格式
License⽂件采⽤普通java properties⽂件的定义格式。
⽂件中定义了产品、版本、Mac地址、license类型、license有效期等信息。如下所⽰:
Product.name=cpu
Product.version=3.2
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)。
/
/ 第⼆步:根据产品、版本、Mac地址、有效期等信息,签名产⽣注册号,并将该注册号复制到license中。
License license = License.fromConfigFile("cpu.license");
LicenseFactory.sign(license);
FileHelper.writeFile(new File(LicenseFactory.LICENSE_DIR + "/cpu.license"), String());
// 第三步:利⽤公钥对license进⾏合法性验证。可以在软件代码的重要模块中加⼊下⾯的验证,⽐如登录模块
3、 加强license机制实现模块的安全性
基于Java软件产品⼀般都是由编译⽂件.class组成的发布包,源代码很容易被诸如JAD之类的⼯具反编译出来,据此hacker们可以很轻松的重新实现部分代码来跳过license验证。
签于此,我们可以在编译或者类装载环节下些功夫,尽量增加被破解的难度。⽬前有多种⼯具可以帮
助我们在编译JAVA⽂件的时候进⾏混淆,使得反编译出来的代码可读性很差,难以理解。⾄于类装载环节,可以对编译⽣成的class⽂件进⾏加密,然后通过⾃⼰定制的类装载器classLoader来装载。但这样的实现也并⾮⽆懈可击,类装载器本⾝也是Java⽂件,破解了类装载器也就破解了解密的过程,hacker还是能够反编译出源代码。所以说,这些做法只是尽可能的增加被破解难度,还是⽆法真正杜绝被破解。
另外Mac地址部分的实现也存在漏洞,据说现在有不少软件可以修改Windows、Unix下的机器的Mac地址(也许不是真正的修改,只是⼲扰我们调⽤ipconfig /all 或者 ifconfig等命令读取Mac地址的时候,读取的是这些软件设定的Mac地址)。对这⽅⾯还不是很了解。
以上是我的⼀些实现思路和⽅法,权当抛砖引⽟,欢迎⼤家拍转。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论