利用license机制来保护Java软件产品的安全
轉(zhuǎn)載自:http://infinite.iteye.com/blog/238064
中國是個盜版軟件橫行泛濫的國度,也許這里面有我們社會主義初級階段這個國情的因素,我們確實離不開盜版軟件。但要發(fā)展壯大本國的軟件產(chǎn)業(yè),知識產(chǎn)權(quán)保護亟需重視起來。除了寄希望于大環(huán)境方面的改善,我們自己也可以做些力所能及的事情,保護好自己的軟件產(chǎn)品,以免自己的辛勤勞動成果被他人輕松竊取。
???? 通常可以通過license機制來保護軟件產(chǎn)品的安全,我們可以限定只有購買了license的用戶在特定的機器上使用我們的軟件。
???? 我設(shè)想的license機制有以下的主要功能點:
| ????????? 應(yīng)用程序可以創(chuàng)建以及驗證綁定給用戶、系統(tǒng)等實體的license。 ????????? 防止用戶隨意拷貝軟件和license。 ????????? licenses可以是永久性的或者臨時性的(在某個特定時期內(nèi)有效) ????????? licenses的驗證由JAVA Security API提供的數(shù)字簽名機制來實現(xiàn)。 ????????? license安裝模塊需要用特殊機制對其進行保護,以防被反編譯輕易破解。 |
1、? 定義license的文件格式
License文件采用普通java properties文件的定義格式。
文件中定義了產(chǎn)品、版本、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 |
?? 其中最下面一串?dāng)?shù)據(jù)為根據(jù)上面幾項基本信息簽名產(chǎn)生的注冊號。
2、? 創(chuàng)建以及驗證license
以下是部分實現(xiàn)代碼(篇幅問題,只好只粘方法說明):
| ??? /** 生成公鑰、私鑰對。公鑰公開,注意保管好私鑰(如果泄露,則有可能被hacker隨意創(chuàng)建license)?*/ ??? public static void generateKey() throws Exception; ??? /** 用私鑰對license進行數(shù)據(jù)簽名*/ ?public static synchronized void sign(License license) throws Exception ; ??? /** ???? * 驗證license是否合法。 ???? * 首先驗證Mac地址是否有改變,有的話則非法。(防止用戶自由拷貝軟件)。 ???? * 然后根據(jù)公鑰驗證簽名是否合法。*/ ? boolean validate(License license) throws Exception ; |
然后通過以下三步可以完成整個license的創(chuàng)建以及驗證:
| // 第一步:生成公鑰、私鑰對。公鑰公開,注意保管好私鑰(如果泄露,則有可能被隨意創(chuàng)建license)。 ????? ??LicenseFactory.generateKey();??????? // 第二步:根據(jù)產(chǎn)品、版本、Mac地址、有效期等信息,簽名產(chǎn)生注冊號,并將該注冊號復(fù)制到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機制實現(xiàn)模塊的安全性
基于Java軟件產(chǎn)品一般都是由編譯文件.class組成的發(fā)布包,源代碼很容易被諸如JAD之類的工具反編譯出來,據(jù)此hacker們可以很輕松的重新實現(xiàn)部分代碼來跳過license驗證。
簽于此,我們可以在編譯或者類裝載環(huán)節(jié)下些功夫,盡量增加被破解的難度。目前有多種工具可以幫助我們在編譯JAVA文件的時候進行混淆,使得反編譯出來的代碼可讀性很差,難以理解。至于類裝載環(huán)節(jié),可以對編譯生成的class文件進行加密,然后通過自己定制的類裝載器classLoader來裝載。但這樣的實現(xiàn)也并非無懈可擊,類裝載器本身也是Java文件,破解了類裝載器也就破解了解密的過程,hacker還是能夠反編譯出源代碼。所以說,這些做法只是盡可能的增加被破解難度,還是無法真正杜絕被破解。
另外Mac地址部分的實現(xiàn)也存在漏洞,據(jù)說現(xiàn)在有不少軟件可以修改Windows、Unix下的機器的Mac地址(也許不是真正的修改,只是干擾我們調(diào)用ipconfig /all 或者 ifconfig等命令讀取Mac地址的時候,讀取的是這些軟件設(shè)定的Mac地址)。對這方面還不是很了解。
以上是我的一些實現(xiàn)思路和方法,權(quán)當(dāng)拋磚引玉,歡迎大家拍轉(zhuǎn)。個人郵箱 : lovejava@163.com。
總結(jié)
以上是生活随笔為你收集整理的利用license机制来保护Java软件产品的安全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 加密解密简单实现
- 下一篇: 页面调优