`
xiangxingchina
  • 浏览: 507502 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

权限 授权之 - License

阅读更多

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

     通常可以通过 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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics