<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA加密解密---自定義類加載器應(yīng)用

    Posted on 2007-04-22 11:09 久城 閱讀(4983) 評論(5)  編輯  收藏 所屬分類: Java理解筆記
    最近在研究JAVA CLASS LOADING技術(shù),已實現(xiàn)了一個自定義的加載器。對目前自定義加載器的應(yīng)用,還在探討中。下面是自定義的CLASSLOADER在JAVA加密解密方面的一些研究。

    JAVA安全

    JAVA是解釋執(zhí)行的語言,對于不同的操作平臺都有相應(yīng)的JVM對字節(jié)碼文件進(jìn)行解釋執(zhí)行。而這個字節(jié)碼文件,也就是我們平時所看到的每一個.class文件。

    這是我們大家都知道的常識,也就是由.java文件,經(jīng)過編譯器編譯,變成JVM所能解釋的.class文件。

    而這個過程,在現(xiàn)在公開的網(wǎng)絡(luò)技術(shù)中,利用一個反編譯器,任何人都可以很容易的獲取它的源文件。這對于很多人來說是不希望看到的。

    對于加密解密技術(shù),我懂的不多,有些可以利用某種技術(shù)“模糊”JAVA類文件。這樣能夠使反編譯的難度增加。但估計反編譯器的技術(shù)水平也在不斷提升,導(dǎo)致這種方法層層受阻。另外還有很多其他的技術(shù)也可以實現(xiàn)對JAVA文件的加密解密。我現(xiàn)在所想要研究的,就是其中的一種。

    JAVA的靈活性使反編譯變得容易,同時,也讓我們的加密解密的方法變得靈活。

    利用自定義的CLASSLOADER

    參照:http://m.tkk7.com/realsmy/archive/2007/04/18/111582.html

    JAVA中的每一個類都是通過類加載器加載到內(nèi)存中的。對于類加載器的工作流程如下表示:
    1.searchfile()
    找到我所要加載的類文件。(拋除JAR包的概念,現(xiàn)在只是要加載一個.class文件)
    2.loadDataClass()
    讀取這個類文件的字節(jié)碼。
    3.difineClass()
    加載類文件。(加載的過程其實很復(fù)雜,我們現(xiàn)在先不研究它。)

    從這個過程中我們能很清楚的發(fā)現(xiàn),自定義的類加載能夠很輕松的控制每個類文件的加載過程。這樣在第二步(loadDataClass)和第三步(difineClass)之間,我們將會有自己的空間靈活的控制這個過程。

    我們加密解密的技術(shù)就應(yīng)用到這里。

    加密解密

    JAVA加密解密的技術(shù)有很多。JAVA自己提供了良好的類庫對各種算法進(jìn)行支持。對于采用哪種算法,網(wǎng)絡(luò)上說法不一,自己去GOOGLE一下吧。

    下面用DES對稱加密算法(設(shè)定一個密鑰,然后對所有的數(shù)據(jù)進(jìn)行加密)來簡單舉個例子。

    首先,生成一個密鑰KEY。
    我把它保存到key.txt中。這個文件就象是一把鑰匙。誰擁有它,誰就能解開我們的類文件。代碼參考如下:
    package com.neusoft.jiami;

    import java.io.File;
    import java.io.FileOutputStream;
    import java.security.SecureRandom;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;

    class Key {

        
    private String keyName;

        
    public Key(String keyName) {
            
    this.keyName = keyName;
        }


        
    public void createKey(String keyName) throws Exception {

            
    // 創(chuàng)建一個可信任的隨機數(shù)源,DES算法需要
            SecureRandom sr = new SecureRandom();
            
    // 用DES算法創(chuàng)建一個KeyGenerator對象
            KeyGenerator kg = KeyGenerator.getInstance("DES");
            
    // 初始化此密鑰生成器,使其具有確定的密鑰長度
            kg.init(sr);
            
    // 生成密匙
            SecretKey key = kg.generateKey();
            
    // 獲取密鑰數(shù)據(jù)
            byte rawKeyData[] = key.getEncoded();
            
    // 將獲取到密鑰數(shù)據(jù)保存到文件中,待解密時使用
            FileOutputStream fo = new FileOutputStream(new File(keyName));
            fo.write(rawKeyData);
        }


        
    public static void main(String args[]) {
            
    try {
                
    new Key("key.txt");
            }
     catch (Exception e) {
                e.printStackTrace();
            }


        }

    }

    第二步,對我們所要進(jìn)行加密的類文件進(jìn)行加密。

    比如我有一個DigestPass類,已經(jīng)被正常編譯好生成DigestPass.class文件。此時,這個類文件是任何人都可以用的。因為系統(tǒng)的類加載器可以自動的加載它。那么下一步,我們要做的就是把這個類文件加密。使系統(tǒng)的類加載器無法讀取到正確的字節(jié)碼文件。參考代碼如下:
    package com.neusoft.jiami;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.security.SecureRandom;

    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;

    public class JiaMi {

        
    public static void main(String[] args) throws Exception {

            
    // DES算法要求有一個可信任的隨機數(shù)源
            SecureRandom sr = new SecureRandom();
            
    // 獲得密匙數(shù)據(jù)
            FileInputStream fi = new FileInputStream(new File("key.txt"));
            
    byte rawKeyData[] = new byte[fi.available()];
            fi.read(rawKeyData);
            fi.close();
            
    // 從原始密匙數(shù)據(jù)創(chuàng)建DESKeySpec對象
            DESKeySpec dks = new DESKeySpec(rawKeyData);
            
    // 創(chuàng)建一個密匙工廠,然后用它把DESKeySpec轉(zhuǎn)換成一個SecretKey對象
            SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(dks);
            
    // Cipher對象實際完成加密操作
            Cipher cipher = Cipher.getInstance("DES");
            
    // 用密匙初始化Cipher對象
            cipher.init(Cipher.ENCRYPT_MODE, key, sr);
            
    // 現(xiàn)在,獲取要加密的文件數(shù)據(jù)
            FileInputStream fi2 = new FileInputStream(new File("DigestPass.class"));
            
    byte data[] = new byte[fi2.available()];
            fi2.read(data);
            fi2.close();
            
    // 正式執(zhí)行加密操作
            byte encryptedData[] = cipher.doFinal(data);
            
    // 用加密后的數(shù)據(jù)覆蓋原文件
            FileOutputStream fo = new FileOutputStream(new File("DigestPass.class"));
            fo.write(encryptedData);
            fo.close();
        }

    }


    第三步,用自定義的CLASSLOADER進(jìn)行加載。參考代碼如下:
    package com.neusoft.jiami;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.security.SecureRandom;

    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import com.neusoft.classloader.MyClassLoader;

    public class JieMi {

        
    public static void main(String[] args) throws Exception {

            
    // DES算法要求有一個可信任的隨機數(shù)源
            SecureRandom sr = new SecureRandom();
            
    // 獲得密匙數(shù)據(jù)
            FileInputStream fi = new FileInputStream(new File("key.txt"));
            
    byte rawKeyData[] = new byte[fi.available()];// = new byte[5];
            fi.read(rawKeyData);
            fi.close();
            
    // 從原始密匙數(shù)據(jù)創(chuàng)建一個DESKeySpec對象
            DESKeySpec dks = new DESKeySpec(rawKeyData);
            
    // 創(chuàng)建一個密匙工廠,然后用它把DESKeySpec對象轉(zhuǎn)換成一個SecretKey對象
            SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(dks);
            
    // Cipher對象實際完成解密操作
            Cipher cipher = Cipher.getInstance("DES");
            
    // 用密匙初始化Cipher對象
            cipher.init(Cipher.DECRYPT_MODE, key, sr);
            
    // 現(xiàn)在,獲取數(shù)據(jù)并解密
            FileInputStream fi2 = new FileInputStream(new File("DigestPass.class"));
            
    byte encryptedData[] = new byte[fi2.available()];
            fi2.read(encryptedData);
            fi2.close();
            
    // 正式執(zhí)行解密操作
            byte decryptedData[] = cipher.doFinal(encryptedData);
            
    // 這時把數(shù)據(jù)還原成原有的類文件
            
    // FileOutputStream fo = new FileOutputStream(new
            
    // File("DigestPass.class"));
            
    // fo.write(decryptedData);
            
    // 用解密后的數(shù)據(jù)加載類并應(yīng)用
            MyClassloader mcl = new MyClassloader("E:/");
            Class cl 
    = mcl.loadClass(decryptedData, "com.neusoft.jiami.DigestPass");
            DigestPass dp 
    = cl.newInstance();
        }

    }

    這樣,我們就完成了類的加密解密。這個過程留給我們修改的空間還很多。我也在理解過程中。

    總結(jié)

    自定義的類加載器能夠靈活的控制類的加載過程。從而可以實現(xiàn)一些我們所要的功能。

    但是,即使是這樣的加密技術(shù),對于某些高手來說,依然是脆弱的。我們所需要做的就是,理解這其中的過程,掌握這樣的技術(shù),最終能夠應(yīng)用到我們自己的實際項目中來。

    歡迎來訪!^.^!
    本BLOG僅用于個人學(xué)習(xí)交流!
    目的在于記錄個人成長.
    所有文字均屬于個人理解.
    如有錯誤,望多多指教!不勝感激!

    Feedback

    # re: JAVA加密解密---自定義類加載器應(yīng)用  回復(fù)  更多評論   

    2007-04-22 13:06 by kurt
    DES是對稱加密算法不是公鑰加密算法

    # re: JAVA加密解密---自定義類加載器應(yīng)用  回復(fù)  更多評論   

    2007-04-22 13:14 by 久城
    @kurt
    多謝指點,已經(jīng)修改。

    # re: JAVA加密解密---自定義類加載器應(yīng)用  回復(fù)  更多評論   

    2007-04-23 15:07 by 交口稱贊
    類加載器本身怎么辦


    別人反編譯你的類加載器,
    然后用你的類加載器去解密。。。

    你難道還弄個加載器的加載器?

    # re: JAVA加密解密---自定義類加載器應(yīng)用  回復(fù)  更多評論   

    2007-04-23 18:37 by 久城
    @交口稱贊
    謝謝,我是這樣想的,這個方法可以使用于網(wǎng)絡(luò)加載類。密鑰文件保存在客戶端與服務(wù)器端,自定義的類加載器保存在客戶端。通過網(wǎng)絡(luò)傳輸?shù)闹挥屑用苓^的字節(jié)碼。類加載器只在本機上運行。這樣即使被網(wǎng)絡(luò)截取到字節(jié)碼文件,也很難被反編譯。
    但是如果攻擊者能夠訪問到我的客戶端,并且取得我的類加載器的話。那我這樣加密就無效了。
    至于如何對類加載器加密?嘿嘿,我在這方面是菜菜!學(xué)習(xí)。

    # re: JAVA加密解密---自定義類加載器應(yīng)用  回復(fù)  更多評論   

    2007-04-25 18:08 by liji
    hello kitty! :D

    Copyright © 久城

    主站蜘蛛池模板: 亚洲AV无码AV日韩AV网站| 国产成人免费A在线视频| 91福利免费体验区观看区| 又粗又大又猛又爽免费视频| 最近中文字幕免费mv视频8| 国产激情久久久久影院老熟女免费 | 国产99视频精品免费视频7| 女人18毛片a级毛片免费| 在线视频精品免费| 一级毛片试看60分钟免费播放| 国产亚洲福利精品一区二区| 亚洲av最新在线观看网址| 亚洲精品美女久久久久久久| 男人天堂2018亚洲男人天堂| 亚洲精品乱码久久久久久下载 | 青青在线久青草免费观看| 91免费国产精品| 亚洲高清中文字幕免费| AV无码免费永久在线观看| 日本免费污片中国特一级| 一级特黄aa毛片免费观看| 美女在线视频观看影院免费天天看| 国产VA免费精品高清在线| 五月婷婷免费视频| 亚洲国产成人精品91久久久| 精品国产免费观看| 亚洲国产综合人成综合网站| 亚洲色偷拍区另类无码专区| 成人a视频片在线观看免费| 日韩免费三级电影| 爽爽爽爽爽爽爽成人免费观看| 中文字幕无线码中文字幕免费| 成人网站免费大全日韩国产| 久久er国产精品免费观看2| 久久久久久国产精品免费免费男同 | 亚洲日韩av无码| 亚洲欧洲日产国码二区首页| 午夜亚洲av永久无码精品| 亚洲一本大道无码av天堂| 久久丫精品国产亚洲av不卡| 久久精品国产亚洲一区二区三区|