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

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

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

    JAVA加密解密---自定義類加載器應用

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

    JAVA安全

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

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

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

    對于加密解密技術(shù),我懂的不多,有些可以利用某種技術(shù)“模糊”JAVA類文件。這樣能夠使反編譯的難度增加。但估計反編譯器的技術(shù)水平也在不斷提升,導致這種方法層層受阻。另外還有很多其他的技術(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()
    加載類文件。(加載的過程其實很復雜,我們現(xiàn)在先不研究它。)

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

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

    加密解密

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

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

    首先,生成一個密鑰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();
            }


        }

    }

    第二步,對我們所要進行加密的類文件進行加密。

    比如我有一個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進行加載。參考代碼如下:
    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ù)加載類并應用
            MyClassloader mcl = new MyClassloader("E:/");
            Class cl 
    = mcl.loadClass(decryptedData, "com.neusoft.jiami.DigestPass");
            DigestPass dp 
    = cl.newInstance();
        }

    }

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

    總結(jié)

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

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

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

    Feedback

    # re: JAVA加密解密---自定義類加載器應用  回復  更多評論   

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

    # re: JAVA加密解密---自定義類加載器應用  回復  更多評論   

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

    # re: JAVA加密解密---自定義類加載器應用  回復  更多評論   

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


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

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

    # re: JAVA加密解密---自定義類加載器應用  回復  更多評論   

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

    # re: JAVA加密解密---自定義類加載器應用  回復  更多評論   

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

    Copyright © 久城

    主站蜘蛛池模板: 亚洲日韩精品无码专区加勒比| 精品熟女少妇a∨免费久久| 国产成人精品亚洲日本在线 | 亚洲一卡2卡4卡5卡6卡在线99| 亚洲人成网站观看在线播放| 最近中文字幕无吗高清免费视频| 国产精品免费观看调教网| 亚洲国产成人久久综合野外| 91在线视频免费91| 久久不见久久见免费视频7| 亚洲一级片免费看| 看免费毛片天天看| 亚洲av无码专区在线电影| 亚洲精品成人久久久| 精品国产一区二区三区免费看| 亚洲成人免费网站| 欧洲人免费视频网站在线| 国产在线精品一区免费香蕉| 亚洲综合久久成人69| 亚洲人成精品久久久久| 亚洲精品A在线观看| 国产又大又粗又硬又长免费| www免费插插视频| 亚洲欧洲日产国码www| 亚洲成人一区二区| 国产乱子伦精品免费无码专区 | 亚洲国产综合91精品麻豆| 国产偷国产偷亚洲高清日韩| 亚洲精品无码你懂的网站| 免费一级毛片女人图片| 国产在线观看免费视频播放器| 日韩在线免费看网站| 麻豆成人久久精品二区三区免费| 久久免费线看线看| 免费精品无码AV片在线观看| 人妻无码一区二区三区免费 | 亚洲va精品中文字幕| 亚洲国产精品日韩在线| 亚洲AV无码国产精品色| 99亚偷拍自图区亚洲| 亚洲大码熟女在线观看|