一
對於傳統的C或C++之類的語言來說
有幾種技術可以
我們可以用流行的加密工具加密應用
Java運行時裝入字節碼的機制隱含地意味著可以對字節碼進行修改
我們可以通過定制ClassLoader
由於把原始字節碼轉換成Class對象的過程完全由系統負責
Java
這為我們編寫定制的ClassLoader提供了一條捷徑
不過
二
每一個運行著的JVM已經擁有一個ClassLoader
應用定制ClassLoader要求對這個過程有較為深入的認識
【Listing
以下是引用片段
// 首先創建一個ClassLoader對象
ClassLoader myClassLoader = new myClassLoader();
// 利用定制ClassLoader對象裝入類文件
// 並把它轉換成Class對象
Class myClass = myClassLoader
// 最後
Object newInstance = myClass
// 注意
// 定制的ClassLoader自動裝入
如前所述
ClassLoader有幾個重要的方法
【Listing
以下是引用片段
public Class loadClass( String name
throws ClassNotFoundException {
try {
// 我們要創建的Class對象
Class clasz = null;
// 必需的步驟
// 我們不必再次裝入它
clasz = findLoadedClass( name );
if (clasz != null)
return clasz;
// 下面是定制部分
byte classData[] = /* 通過某種方法獲取字節碼數據 */;
if (classData != null) {
// 成功讀取字節碼數據
clasz = defineClass( name
}
// 必需的步驟
// 我們嘗試用默認的ClassLoader裝入它
if (clasz == null)
clasz = findSystemClass( name );
// 必需的步驟
if (resolve && clasz != null)
resolveClass( clasz );
// 把類返回給調用者
return clasz;
} catch( IOException ie ) {
throw new ClassNotFoundException( ie
} catch( GeneralSecurityException gse ) {
throw new ClassNotFoundException( gse
}
}
Listing
findLoadedClass
defineClass
findSystemClass
resolveClass
三
Java加密擴展即Java Cryptography Extension
JCE沒有規定具體的加密算法
為簡單計
步驟
以下是引用片段
// DES算法要求有一個可信任的隨機數源
SecureRandom sr = new SecureRandom();
// 為我們選擇的DES算法生成一個KeyGenerator對象
KeyGenerator kg = KeyGenerator
kg
// 生成密匙
SecretKey key = kg
// 獲取密匙數據
byte rawKeyData[] = key
/* 接下來就可以用密匙進行加密或解密
為文件供以後使用 */
doSomething( rawKeyData );
步驟
以下是引用片段
// DES算法要求有一個可信任的隨機數源
SecureRandom sr = new SecureRandom();
byte rawKeyData[] = /* 用某種方法獲得密匙數據 */;
// 從原始密匙數據創建DESKeySpec對象
DESKeySpec dks = new DESKeySpec( rawKeyData );
// 創建一個密匙工廠
// 一個SecretKey對象
SecretKeyFactory keyFactory = SecretKeyFactory
SecretKey key = keyFactory
// Cipher對象實際完成加密操作
Cipher cipher = Cipher
// 用密匙初始化Cipher對象
cipher
// 現在
byte data[] = /* 用某種方法獲取數據 */
// 正式執行加密操作
byte encryptedData[] = cipher
// 進一步處理加密後的數據
doSomething( encryptedData );
步驟
// DES算法要求有一個可信任的隨機數源
SecureRandom sr = new SecureRandom();
byte rawKeyData[] = /* 用某種方法獲取原始密匙數據 */;
// 從原始密匙數據創建一個DESKeySpec對象
DESKeySpec dks = new DESKeySpec( rawKeyData );
// 創建一個密匙工廠
// 一個SecretKey對象
SecretKeyFactory keyFactory = SecretKeyFactory
SecretKey key = keyFactory
// Cipher對象實際完成解密操作
Cipher cipher = Cipher
// 用密匙初始化Cipher對象
cipher
// 現在
byte encryptedData[] = /* 獲得經過加密的數據 */
// 正式執行解密操作
byte decryptedData[] = cipher
// 進一步處理解密後的數據
doSomething( decryptedData );
四
前面介紹了如何加密和解密數據
步驟
步驟
步驟
該命令把每一個
步驟
以下是引用片段
import java
import java
import java
import javax
import javax
public class DecryptStart extends ClassLoader
{
// 這些對象在構造函數中設置
// 以後loadClass()方法將利用它們解密類
private SecretKey key;
private Cipher cipher;
// 構造函數
public DecryptStart( SecretKey key ) throws GeneralSecurityException
IOException {
this
String algorithm =
SecureRandom sr = new SecureRandom();
System
cipher = Cipher
cipher
}
// main過程
// 實例
// 設置好ClassLoader以後
// 最後
static public void main( String args[] ) throws Exception {
String keyFilename = args[
String appName = args[
// 這些是傳遞給應用本身的參數
String realArgs[] = new String[args
System
// 讀取密匙
System
byte rawKey[] = Util
DESKeySpec dks = new DESKeySpec( rawKey );
SecretKeyFactory keyFactory = SecretKeyFactory
SecretKey key = keyFactory
// 創建解密的ClassLoader
DecryptStart dr = new DecryptStart( key );
// 創建應用主類的一個實例
// 通過ClassLoader裝入它
System
Class clasz = dr
// 最後
// 的main()方法
// 獲取一個對main()的引用
String proto[] = new String[
Class mainArgs[] = { (new String[
Method main = clasz
// 創建一個包含main()方法參數的數組
Object argsArray[] = { realArgs };
System
// 調用main()
main
}
public Class loadClass( String name
throws ClassNotFoundException {
try {
// 我們要創建的Class對象
Class clasz = null;
// 必需的步驟
// 我們不必再次裝入它
clasz = findLoadedClass( name );
if (clasz != null)
return clasz;
// 下面是定制部分
try {
// 讀取經過加密的類文件
byte classData[] = Util
if (classData != null) {
// 解密
byte decryptedClassData[] = cipher
//
clasz = defineClass( name
System
}
} catch( FileNotFoundException fnfe )
// 必需的步驟
// 我們嘗試用默認的ClassLoader裝入它
if (clasz == null)
clasz = findSystemClass( name );
// 必需的步驟
if (resolve && clasz != null)
resolveClass( clasz );
// 把類返回給調用者
return clasz;
} catch( IOException ie ) {
throw new ClassNotFoundException( ie
);
} catch( GeneralSecurityException gse ) {
throw new ClassNotFoundException( gse
);
}
}
}
對於未經加密的應用
對於經過加密的應用
DecryptStart有兩個目的
五
我們看到
雖然應用本身經過了加密
另外還要記住的是
不過應該指出的是
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25751.html