日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

如何有效防止Java程序源碼被人偷窺?(3)_Mssql數(shù)據(jù)庫教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:如何快速生成100萬不重復(fù)的8位編號
最近在論壇看到有人問,如何快速生成100萬不重復(fù)的8位編號,對于這個問題,有幾點(diǎn)是需要注意的: 1. 如何生成8位隨機(jī)數(shù),生成的數(shù)越隨機(jī),重復(fù)的可能性當(dāng)然越小 2. 控制不重復(fù)

四、應(yīng)用實(shí)例

前面介紹了如何加密和解密數(shù)據(jù)。要部署一個經(jīng)過加密的應(yīng)用,步驟如下:

步驟1:創(chuàng)建應(yīng)用。我們的例子包含一個App主類,兩個輔助類(分別稱為Foo和Bar)。這個應(yīng)用沒有什么實(shí)際功用,但只要我們能夠加密這個應(yīng)用,加密其他應(yīng)用也就不在話下。

步驟2:生成一個安全密匙。在命令行,利用GenerateKey工具(參見GenerateKey.java)把密匙寫入一個文件: % java GenerateKey key.data

步驟3:加密應(yīng)用。在命令行,利用EncryptClasses工具(參見EncryptClasses.java)加密應(yīng)用的類: % java EncryptClasses key.data App.class Foo.class Bar.class

該命令把每一個.class文件替換成它們各自的加密版本。

步驟4:運(yùn)行經(jīng)過加密的應(yīng)用。用戶通過一個DecryptStart程序運(yùn)行經(jīng)過加密的應(yīng)用。DecryptStart程序如Listing 6所示。 【Listing 6:DecryptStart.java,啟動被加密應(yīng)用的程序】

以下為引用的內(nèi)容:
import java.io.*;
  import java.security.*;
  import java.lang.reflect.*;
  import javax.crypto.*;
  import javax.crypto.spec.*;
  public class DecryptStart extends ClassLoader
  {
  // 這些對象在構(gòu)造函數(shù)中設(shè)置,
  // 以后loadClass()方法將利用它們解密類
  private SecretKey key;
  private Cipher cipher;
  // 構(gòu)造函數(shù):設(shè)置解密所需要的對象
  public DecryptStart( SecretKey key ) throws GeneralSecurityException,
  IOException {
  this.key = key;
  String algorithm = "DES";
  SecureRandom sr = new SecureRandom();
  System.err.println( "[DecryptStart: creating cipher]" );
  cipher = Cipher.getInstance( algorithm );
  cipher.init( Cipher.DECRYPT_MODE, key, sr );
  }
  // main過程:我們要在這里讀入密匙,創(chuàng)建DecryptStart的
  // 實(shí)例,它就是我們的定制ClassLoader。
  // 設(shè)置好ClassLoader以后,我們用它裝入應(yīng)用實(shí)例,
  // 最后,我們通過Java Reflection API調(diào)用應(yīng)用實(shí)例的main方法
  static public void main( String args[] ) throws Exception {
  String keyFilename = args[0];
  String appName = args[1];
  // 這些是傳遞給應(yīng)用本身的參數(shù)
  String realArgs[] = new String[args.length-2];
  System.arraycopy( args, 2, realArgs, 0, args.length-2 );
  // 讀取密匙
  System.err.println( "[DecryptStart: reading key]" );
  byte rawKey[] = Util.readFile( keyFilename );
  DESKeySpec dks = new DESKeySpec( rawKey );
  SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );
  SecretKey key = keyFactory.generateSecret( dks );
  // 創(chuàng)建解密的ClassLoader
  DecryptStart dr = new DecryptStart( key );
  // 創(chuàng)建應(yīng)用主類的一個實(shí)例
  // 通過ClassLoader裝入它
  System.err.println( "[DecryptStart: loading " appName "]" );
  Class clasz = dr.loadClass( appName );
  // 最后,通過Reflection API調(diào)用應(yīng)用實(shí)例
  // 的main()方法
  // 獲取一個對main()的引用
  String proto[] = new String[1];
  Class mainArgs[] = { (new String[1]).getClass() };
  Method main = clasz.getMethod( "main", mainArgs );
  // 創(chuàng)建一個包含main()方法參數(shù)的數(shù)組
  Object argsArray[] = { realArgs };
  System.err.println( "[DecryptStart: running " appName ".main()]" );
  // 調(diào)用main()
  main.invoke( null, argsArray );
  }
  public Class loadClass( String name, boolean resolve )
  throws ClassNotFoundException {
  try {
  // 我們要創(chuàng)建的Class對象
  Class clasz = null;
  // 必需的步驟1:如果類已經(jīng)在系統(tǒng)緩沖之中
  // 我們不必再次裝入它
  clasz = findLoadedClass( name );
  if (clasz != null)
  return clasz;
  // 下面是定制部分
  try {
  // 讀取經(jīng)過加密的類文件
  byte classData[] = Util.readFile( name ".class" );
  if (classData != null) {
  // 解密...
  byte decryptedClassData[] = cipher.doFinal( classData );
  // ... 再把它轉(zhuǎn)換成一個類
  clasz = defineClass( name, decryptedClassData,
  0, decryptedClassData.length );
  System.err.println( "[DecryptStart: decrypting class " name "]" );
  }
  } catch( FileNotFoundException fnfe )
  // 必需的步驟2:如果上面沒有成功
  // 我們嘗試用默認(rèn)的ClassLoader裝入它
  if (clasz == null)
  clasz = findSystemClass( name );
  // 必需的步驟3:如有必要,則裝入相關(guān)的類
  if (resolve && clasz != null)
  resolveClass( clasz );
  // 把類返回給調(diào)用者
  return clasz;
  } catch( IOException ie ) {
  throw new ClassNotFoundException( ie.toString()
  );
  } catch( GeneralSecurityException gse ) {
  throw new ClassNotFoundException( gse.toString()
  );
  }
  }
  }

對于未經(jīng)加密的應(yīng)用,正常執(zhí)行方式如下: % java App arg0 arg1 arg2

對于經(jīng)過加密的應(yīng)用,則相應(yīng)的運(yùn)行方式為: % java DecryptStart key.data App arg0 arg1 arg2

DecryptStart有兩個目的。一個DecryptStart的實(shí)例就是一個實(shí)施即時解密操作的定制ClassLoader;同時,DecryptStart還包含一個main過程,它創(chuàng)建解密器實(shí)例并用它裝入和運(yùn)行應(yīng)用。示例應(yīng)用App的代碼包含在App.java、Foo.java和Bar.java內(nèi)。Util.java是一個文件I/O工具,本文示例多處用到了它。完整的代碼請從本文最后下載。

五、注意事項

我們看到,要在不修改源代碼的情況下加密一個Java應(yīng)用是很容易的。不過,世上沒有完全安全的系統(tǒng)。本文的加密方式提供了一定程度的源代碼保護(hù),但對某些攻擊來說它是脆弱的。

雖然應(yīng)用本身經(jīng)過了加密,但啟動程序DecryptStart沒有加密。攻擊者可以反編譯啟動程序并修改它,把解密后的類文件保存到磁盤。降低這種風(fēng)險的辦法之一是對啟動程序進(jìn)行高質(zhì)量的模糊處理�;蛘�,啟動程序也可以采用直接編譯成機(jī)器語言的代碼,使得啟動程序具有傳統(tǒng)執(zhí)行文件格式的安全性。

另外還要記住的是,大多數(shù)JVM本身并不安全。狡猾的黑客可能會修改JVM,從ClassLoader之外獲取解密后的代碼并保存到磁盤,從而繞過本文的加密技術(shù)。Java沒有為此提供真正有效的補(bǔ)救措施。

不過應(yīng)該指出的是,所有這些可能的攻擊都有一個前提,這就是攻擊者可以得到密匙。如果沒有密匙,應(yīng)用的安全性就完全取決于加密算法的安全性。雖然這種保護(hù)代碼的方法稱不上十全十美,但它仍不失為一種保護(hù)知識產(chǎn)權(quán)和敏感用戶數(shù)據(jù)的有效方案。

分享:四個語句幫你提高 SQL Server 的伸縮性
本文講解如何使用LEFT JOIN、CROSS JOIN以及IDENTITY值的檢索,這些技術(shù)來提高基于SQL Server的應(yīng)用程序的性能或改善其可伸縮性。 你將遇到的現(xiàn)象:應(yīng)用程序中的SQL 查詢不能按照您想要的方式

共3頁上一頁123下一頁
來源:模板無憂//所屬分類:Mssql數(shù)據(jù)庫教程/更新時間:2008-08-22
相關(guān)Mssql數(shù)據(jù)庫教程