java jar包加密


上周鍾哥要我寫一個從國泰君安發送數據到資訊后台的程序。因為接口和數據發送的部分我已經做過很多次,在熟悉了oracle的數據庫結構和sql語法之后,很快完成任務。但是由於這次程序是給公司外面的人用,程序的打包發布要求有所不同,需要更靈活的配置和安全的反編譯機制。以前寫的程序都是做成war包的形式放在自己的服務器上運行,而myeclipse擁有完善的war包發布功能,所以對java項目的打包原理並沒有太多了解。這次自己打jar包和加密碰到了不少問題,不過最終還是順利解決,收獲不小。決定做些記錄,以備后用。

  java項目的打包其實比較簡單,將項目的java文件編譯以后,編寫一個MANIFEST.MF文件,若需要打包后的jar文件可以直接運行,需要在MANIFEST.MF中加入maniclass: 包名.類名,表明項目運行的主類

  本項目內容如下:Manifest-Version: 1.0
                 Created-By: Fat Jar Eclipse Plug-In
                 Main-Class: com.gw.sec.DecryptStart

  如果引用到外部包,需要將外部包的class解壓與項目class一同打包,myeclipse的fatjar插件實現了上述功能,在解壓sqljdbc驅動的過程中,因為sqljdbc.jar是簽名過的jar包,解壓之后破壞了簽名無法使用其中的class文件,后來找到解決方法如下,先解壓原版sqljdbc.jar,重寫一個MANIFEST.MF,內容如下:

               Manifest-Version: 1.0
               Main-Class:
               Class-path: sqljdbc.jar

將MANIFEST文件與解壓后的com文件夾放於同級目錄下,然后在命令行下重新打包得到新的sqljdbc.jar,命令如下:jar -cvmf MANIFEST.MF sqljdbc.jar com

程序打包后,讀取配置文件的路徑與jar包在同級目錄,並將jre放置與jar包同級目錄下,編寫bat文件:

set path=程序目錄絕對路徑\jre\bin

jar啟動命令:java -jar .....

這樣運行bat文件,系統就會調用程序目錄jre下的java.exe,用戶便無需自行安裝jre也能運行程序,jre目錄占空間比較大,90mb左右,可以視情況對目錄進行精簡,不必要的jar包,licence等可以刪掉,只要保證程序能正常運行便可。

由於java的反編譯十分方便,所以程序發布打包前應當對class文件進行加密,避免被他人反編譯獲取一些不希望被獲取的信息。這里用到了java的jce框架,具體思路如下,通過一個keyGenerator類根據DES算法生成一個密鑰文件key.data,

      String keyFilename = "key.data";
    String algorithm = "DES";

    // 生成密匙
    SecureRandom sr = new SecureRandom();
    KeyGenerator kg = KeyGenerator.getInstance( algorithm );
    kg.init( sr );
    SecretKey key = kg.generateKey();

    // 把密匙數據保存到文件
    Util.writeFile( keyFilename, key.getEncoded()

然后運行加密類EncryptClass讀取密鑰對指定class文件進行加密,一般加密項目class文件便可,

將解密類DecryptStart與項目class一同打包,每次要運行程序時先啟動DecryptStart類,讀取密鑰,通過反射機制解密主類class,並調用其main方法,然后解密所調用的其他類,運行程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM