熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

利用DES加密算法保護Java源代碼

2013-11-15 11:51:43  來源: JSP教程 

  Java語言是一種非常適用於網絡編程的語言它的基本結構與C++極為相似但拋棄了C/C++中指針等內容同時它吸收了SmalltalkC++面向對象的編程思想它具有簡單性魯棒性可移植性動態性等特點這些特點使得Java成為跨平台應用開發的一種規范在世界范圍內廣泛流傳
  
  加密Java源碼的原因
  
  Java源代碼經過編譯以後在JVM中執行由於JVM界面是完全透明的Java類文件能夠很容易通過反編譯器重新轉換成源代碼因此所有的算法類文件等都可以以源代碼的形式被公開使得軟件不能受到保護為了保護產權一般可以有以下幾種方法
  
  (模糊類文件加大反編譯器反編譯源代碼文件的難度然而可以修改反編譯器使之能夠處理這些模糊類文件所以僅僅依賴模糊類文件來保證代碼的安全是不夠的
  
  ()流行的加密工具對源文件進行加密比如PGP(Pretty Good Privacy)或GPG(GNU Privacy Guard)這時最終用戶在運行應用之前必須先進行解密但解密之後最終用戶就有了一份不加密的類文件這和事先不進行加密沒有什麼差別
  
  ()加密類文件在運行中JVM用定制的類裝載器(Class Loader)解密類文件Java運行時裝入字節碼的機制隱含地意味著可以對字節碼進行修改JVM每次裝入類文件時都需要一個稱為ClassLoader的對象這個對象負責把新的類裝入正在運行的JVMJVM給ClassLoader一個包含了待裝入類(例如javalangObject)名字的字符串然後由ClassLoader負責找到類文件裝入原始數據並把它轉換成一個Class對象
  
  用戶下載的是加密過的類文件在加密類文件裝入之時進行解密因此可以看成是一種即時解密器由於解密後的字節碼文件永遠不會保存到文件系統所以竊密者很難得到解密後的代碼
  
  由於把原始字節碼轉換成Class對象的過程完全由系統負責所以創建定制ClassLoader對象其實並不困難只需先獲得原始數據接著就可以進行包含解密在內的任何轉換
  
  Java密碼體系和Java密碼擴展
  
  Java密碼體系(JCA)和Java密碼擴展(JCE)的設計目的是為Java提供與實現無關的加密函數API它們都用factory方法來創建類的例程然後把實際的加密函數委托給提供者指定的底層引擎引擎中為類提供了服務提供者接口在Java中實現數據的加密/解密是使用其內置的JCE(Java加密擴展)來實現的Java開發工具集為實現包括數字簽名和信息摘要在內的加密功能推出了一種基於供應商的新型靈活應用編程接口Java密碼體系結構支持供應商的互操作同時支持硬件和軟件實現
  
  Java密碼學結構設計遵循兩個原則:
  
  ()算法的獨立性和可靠性
  
  ()實現的獨立性和相互作用性
  
  算法的獨立性是通過定義密碼服務類來獲得用戶只需了解密碼算法的概念而不用去關心如何實現這些概念實現的獨立性和相互作用性通過密碼服務提供器來實現密碼服務提供器是實現一個或多個密碼服務的一個或多個程序包軟件開發商根據一定接口將各種算法實現後打包成一個提供器用戶可以安裝不同的提供器安裝和配置提供器可將包含提供器的ZIP和JAR文件放在CLASSPATH下再編輯Java安全屬性文件來設置定義一個提供器Java運行環境Sun版本時 提供一個缺省的提供器Sun
  
  下面介紹DES算法及如何利用DES算法加密和解密類文件的步驟
  
  DES算法簡介
  
  DES(Data Encryption Standard)是發明最早的最廣泛使用的分組對稱加密算法DES算法的入口參數有三個KeyDataMode其中Key為個字節共是DES算法的工作密鑰Data也為個字節是要被加密或被解密的數據Mode為DES的工作方式有兩種加密或解密
  
  DES算法工作流程如下若Mode為加密模式則利用Key 對數據Data進行加密 生成Data的密碼形式(位)作為DES的輸出結果如Mode為解密模式則利用Key對密碼形式的數據Data進行解密還原為Data的明碼形式(位)作為DES的輸出結果在通信網絡的兩端雙方約定一致的Key在通信的源點用Key對核心數據進行DES加密然後以密碼形式在公共通信網(如電話網)中傳輸到通信網絡的終點數據到達目的地後用同樣的Key對密碼數據進行解密便再現了明碼形式的核心數據這樣便保證了核心數據在公共通信網中傳輸的安全性和可靠性
  
  也可以通過定期在通信網絡的源端和目的端同時改用新的Key便能更進一步提高數據的保密性
  
  利用DES算法加密的步驟
  
  ()生成一個安全密鑰在加密或解密任何數據之前需要有一個密鑰密鑰是隨同被加密的應用程序一起發布的一段數據密鑰代碼如下所示
  
  【生成一個密鑰代碼】
  
  // 生成一個可信任的隨機數源
  Secure Random sr = new SecureRandom();
  // 為我們選擇的DES算法生成一個KeyGenerator對象
  KeyGenerator kg = KeyGeneratorgetInstance (DES );
  Kginit (sr);
  // 生成密鑰
  Secret Key key = kggenerateKey();
  // 將密鑰數據保存為文件供以後使用其中key Filename為保存的文件名
  UtilwriteFile (key Filename keygetEncoded () );
  
  ()加密數據得到密鑰之後接下來就可以用它加密數據如下所示
  
  【用密鑰加密原始數據】
  
  // 產生一個可信任的隨機數源
  SecureRandom sr = new SecureRandom();
  //從密鑰文件key Filename中得到密鑰數據
  Byte rawKeyData [] = UtilreadFile (key Filename);
  // 從原始密鑰數據創建DESKeySpec對象
  DESKeySpec dks = new DESKeySpec (rawKeyData);
  // 創建一個密鑰工廠然後用它把DESKeySpec轉換成Secret Key對象
  SecretKeyFactory key Factory = SecretKeyFactorygetInstance(DES );
  Secret Key key = keyFactorygenerateSecret( dks );
  // Cipher對象實際完成加密操作
  Cipher cipher = CiphergetInstance( DES );
  // 用密鑰初始化Cipher對象
  cipherinit( CipherENCRYPT_MODE key sr );
  // 通過讀類文件獲取需要加密的數據
  Byte data [] = UtilreadFile (filename);
  // 執行加密操作
  Byte encryptedClassData [] = cipherdoFinal(data );
  // 保存加密後的文件覆蓋原有的類文件
  UtilwriteFile( filename encryptedClassData );
  
  ()解密數據運行經過加密的程序時ClassLoader分析並解密類文件操作步驟如下所示
  
  【用密鑰解密數據】
  
  // 生成一個可信任的隨機數源
  SecureRandom sr = new SecureRandom();
  // 從密鑰文件中獲取原始密鑰數據
  Byte rawKeyData[] = UtilreadFile( keyFilename );
  // 創建一個DESKeySpec對象
  DESKeySpec dks = new DESKeySpec (rawKeyData);
  // 創建一個密鑰工廠然後用它把DESKeySpec對象轉換成Secret Key對象
  SecretKeyFactory key Factory = SecretKeyFactorygetInstance( DES );
  SecretKey key = keyFactorygenerateSecret( dks );
  // Cipher對象實際完成解密操作
  Cipher cipher = CiphergetInstance( DES );
  // 用密鑰初始化Cipher對象
  Cipherinit( CipherDECRYPT_MODE key sr );
  // 獲得經過加密的數據
  Byte encrypted Data [] = UtilreadFile (Filename);
  //執行解密操作
  Byte decryptedData [] = cipherdoFinal( encryptedData );
  // 然後將解密後的數據轉化成原來的類文件
  
  將上述代碼與自定義的類裝載器結合就可以做到邊解密邊運行從而起到保護源代碼的作用
  
  結束語
  
  加密/解密是數據傳輸中保證數據安全性和完整性的常用方法Java語言因其平台無關性在Internet上的應用非常之廣泛使用DES算法加密Java源碼在一定程度上能保護軟件的產權
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19762.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.