利用license機制來保護Java軟件產品的安全

    通常可以通過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地址部分的實現也存在漏洞,據說現在有不少軟件可以修改WindowsUnix下的機器的Mac地址(也許不是真正的修改,只是干擾我們調用ipconfig /all 或者 ifconfig等命令讀取Mac地址的時候,讀取的是這些軟件設定的Mac地址)。對這方面還不是很瞭解。

以上是我的一些實現思路和方法,權當拋磚引玉,歡迎大家拍轉。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章