用License機制保護java軟件產品

中國是個盜版軟件橫行氾濫的國度,也許這裏面有咱們社會主義初級階段這個國情的因素,咱們確實離不開盜版軟件。但要發展壯大本國的軟件產業,知識產權保護亟需重視起來。除了寄但願於大環境方面的改善,咱們本身也能夠作些力所能及的事情,保護好本身的軟件產品,以避免本身的辛勤勞動成果被他人輕鬆竊取。

     一般能夠經過license機制來保護軟件產品的安全,咱們能夠限定只有購買了license的用戶在特定的機器上使用咱們的軟件。

 我設想的license機制有如下的主要功能點:

Ø         應用程序能夠建立以及驗證綁定給用戶、系統等實體的license。

Ø         防止用戶隨意拷貝軟件和license。

Ø         licenses能夠是永久性的或者臨時性的(在某個特定時期內有效)

Ø         licenses的驗證由JAVA Security API提供的數字簽名機制來實現。

Ø         license安裝模塊須要用特殊機制對其進行保護,以防被反編譯輕易破解。


一、  定義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


   其中最下面一串數據爲根據上面幾項基本信息簽名產生的註冊號。

二、  建立以及驗證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);


三、  增強license機制實現模塊的安全性

基於Java軟件產品通常都是由編譯文件.class組成的發佈包,源代碼很容易被諸如JAD之類的工具反編譯出來,據此hacker們能夠很輕鬆的從新實現部分代碼來跳過license驗證。

籤於此,咱們能夠在編譯或者類裝載環節下些功夫,儘可能增長被破解的難度。目前有多種工具能夠幫助咱們在編譯JAVA文件的時候進行混淆,使得反編譯出來的代碼可讀性不好,難以理解。至於類裝載環節,能夠對編譯生成的class文件進行加密,而後經過本身定製的類裝載器classLoader來裝載。但這樣的實現也並不是無懈可擊,類裝載器自己也是Java文件,破解了類裝載器也就破解了解密的過程,hacker仍是可以反編譯出源代碼。因此說,這些作法只是儘量的增長被破解難度,仍是沒法真正杜絕被破解。

另外Mac地址部分的實現也存在漏洞,聽說如今有很多軟件能夠修改Windows、Unix下的機器的Mac地址(也許不是真正的修改,只是干擾咱們調用ipconfig /all 或者 ifconfig等命令讀取Mac地址的時候,讀取的是這些軟件設定的Mac地址)。對這方面還不是很瞭解
相關文章
相關標籤/搜索