中 国是个盗版软件横行泛滥的国度,也许这里面有我们社会主义初级阶段这个国情的因素,我们确实离不开盗版软件。但要发展壮大本国的软件产业,知识产权保护亟 需重视起来。除了寄希望于大环境方面的改善,我们自己也可以做些力所能及的事情,保护好自己的软件产品,以免自己的辛勤劳动成果被他人轻松窃取。
通常可以通过 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 地址)。对这方面还不是很了解。
以上是我的一些实现思路和方法,权当抛砖引玉,欢迎大家拍转。 个人邮箱 : [email protected] 。