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

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

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

    隨筆 - 64  文章 - 9  trackbacks - 0
    <2009年12月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(6)

    我參與的團(tuán)隊(duì)

    隨筆分類(88)

    隨筆檔案(92)

    文章分類(142)

    文章檔案(182)

    天基成員

    學(xué)習(xí)園

    我的海角

    搜索

    •  

    積分與排名

    • 積分 - 182482
    • 排名 - 319

    最新評(píng)論

      加密解密,曾經(jīng)是我一個(gè)畢業(yè)設(shè)計(jì)的重要組件。在工作了多年以后回想當(dāng)時(shí)那個(gè)加密、解密算法,實(shí)在是太單純了。
        言歸正傳,這里我們主要描述Java已經(jīng)實(shí)現(xiàn)的一些加密解密算法,最后介紹數(shù)字證書。
        如基本的單向加密算法:
        ●  BASE64 嚴(yán)格地說,屬于編碼格式,而非加密算法
        ●  MD5(Message Digest algorithm 5,信息摘要算法)
        ●  SHA(Secure Hash Algorithm,安全散列算法)
        ●  HMAC(Hash Message Authentication Code,散列消息鑒別碼)
        復(fù)雜的對(duì)稱加密(DES、PBE)、非對(duì)稱加密算法:
        ●  DES(Data Encryption Standard,數(shù)據(jù)加密算法)
        ●  PBE(Password-based encryption,基于密碼驗(yàn)證)
        ●  RSA(算法的名字以發(fā)明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
        ●  DH(Diffie-Hellman算法,密鑰一致協(xié)議)
        ●  DSA(Digital Signature Algorithm,數(shù)字簽名)
        ●  ECC(Elliptic Curves Cryptography,橢圓曲線密碼編碼學(xué))
        本篇內(nèi)容簡要介紹BASE64、MD5、SHA、HMAC幾種方法。
        MD5、SHA、HMAC這三種加密算法,可謂是非可逆加密,就是不可解密的加密方法。我們通常只把他們作為加密的基礎(chǔ)。單純的以上三種的加密并不可靠。
        BASE64
        按照RFC2045的定義,Base64被定義為:Base64內(nèi)容傳送編碼被設(shè)計(jì)用來把任意序列的8位字節(jié)描述為一種不易被人直接識(shí)別的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
        常見于郵件、http加密,截取http信息,你就會(huì)發(fā)現(xiàn)登錄操作的用戶名、密碼字段通過BASE64加密的。
        通過java代碼實(shí)現(xiàn)如下:
    /**  
     * BASE64解密  http://www.bt285.cn http://www.5a520.cn
     *   
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static byte[] decryptBASE64(String key) throws Exception {   
        return (new BASE64Decoder()).decodeBuffer(key);   
    }   
      
    /**  
     * BASE64加密  
     *   
     * @param key  
     * @return  
     * @throws Exception  
     */  
    public static String encryptBASE64(byte[] key) throws Exception {   
        return (new BASE64Encoder()).encodeBuffer(key);   
    }
        主要就是BASE64Encoder、BASE64Decoder兩個(gè)類,我們只需要知道使用對(duì)應(yīng)的方法即可。另,BASE加密后產(chǎn)生的字節(jié)位數(shù)是8的倍數(shù),如果不夠位數(shù)以=符號(hào)填充。
        MD5
        MD5 —— message-digest algorithm 5 (信息-摘要算法)縮寫,廣泛用于加密和解密技術(shù),常用于文件校驗(yàn)。校驗(yàn)?不管文件多大,經(jīng)過MD5后都能生成唯一的MD5值。好比現(xiàn)在的ISO校驗(yàn),都是MD5校驗(yàn)。怎么用?當(dāng)然是把ISO經(jīng)過MD5后產(chǎn)生MD5的值。一般下載linux-ISO的朋友都見過下載鏈接旁邊放著MD5的串。就是用來驗(yàn)證文件是否一致的。
        通過java代碼實(shí)現(xiàn)如下:
    /**  
     * MD5加密 http://www.bt285.cn http://www.5a520.cn  
     *   
     * @param data  
     * @return  
     * @throws Exception  
     */  
    public static byte[] encryptMD5(byte[] data) throws Exception {   
      
        MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);   
        md5.update(data);   
      
        return md5.digest();   
      
    }
        通常我們不直接使用上述MD5加密。通常將MD5產(chǎn)生的字節(jié)數(shù)組交給BASE64再加密一把,得到相應(yīng)的字符串。
        SHA
        SHA(Secure Hash Algorithm,安全散列算法),數(shù)字簽名等密碼學(xué)應(yīng)用中重要的工具,被廣泛地應(yīng)用于電子商務(wù)等信息安全領(lǐng)域。雖然,SHA與MD5通過碰撞法都被破解了, 但是SHA仍然是公認(rèn)的安全加密算法,較之MD5更為安全。
        通過java代碼實(shí)現(xiàn)如下:
     /**  
         * SHA加密 http://www.5a520.cn http://www.bt285.cn 
         *   
         * @param data  
         * @return  
         * @throws Exception  
         */  
        public static byte[] encryptSHA(byte[] data) throws Exception {   
      
            MessageDigest sha = MessageDigest.getInstance(KEY_SHA);   
            sha.update(data);   
      
            return sha.digest();   
      
        }   
    }

     HMAC

        HMAC(Hash Message Authentication Code,散列消息鑒別碼,基于密鑰的Hash算法的認(rèn)證協(xié)議。消息鑒別碼實(shí)現(xiàn)鑒別的原理是,用公開函數(shù)和密鑰產(chǎn)生一個(gè)固定長度的值作為認(rèn)證標(biāo)識(shí),用這個(gè)標(biāo)識(shí)鑒別消息的完整性。使用一個(gè)密鑰生成一個(gè)固定大小的小數(shù)據(jù)塊,即MAC,并將其加入到消息中,然后傳輸。接收方利用與發(fā)送方共享的密鑰進(jìn)行鑒別認(rèn)證等。

        通過java代碼實(shí)現(xiàn)如下:

    /**  
     * 初始化HMAC密鑰  
    http://www.guihua.org  http://www.feng123.com
     *   
     * 
    @return  
     * 
    @throws Exception  
     
    */
      
    public static String initMacKey() throws Exception {   
        KeyGenerator keyGenerator 
    = KeyGenerator.getInstance(KEY_MAC);   
      
        SecretKey secretKey 
    = keyGenerator.generateKey();   
        
    return encryptBASE64(secretKey.getEncoded());   
    }
       
      
    /**  
     * HMAC加密  
     *   
     * 
    @param data  
     * 
    @param key  
     * 
    @return  
     * 
    @throws Exception  
     
    */
      
    public static byte[] encryptHMAC(byte[] data, String key) throws Exception {   
      
        SecretKey secretKey 
    = new SecretKeySpec(decryptBASE64(key), KEY_MAC);   
        Mac mac 
    = Mac.getInstance(secretKey.getAlgorithm());   
        mac.init(secretKey);   
      
        
    return mac.doFinal(data);   
      
    }
     

        給出一個(gè)完整類,如下:

    import java.security.MessageDigest;   
      
    import javax.crypto.KeyGenerator;   
    import javax.crypto.Mac;   
    import javax.crypto.SecretKey;   
      
    import sun.misc.BASE64Decoder;   
    import sun.misc.BASE64Encoder;   
      
    /**  
     * 基礎(chǔ)加密組件  
    http://www.bt285.cn http://www.feng123.com
     *   
     * 
    @author 梁棟  
     * 
    @version 1.0  
     * 
    @since 1.0  
     
    */
      
    public abstract class Coder {   
        
    public static final String KEY_SHA = "SHA";   
        
    public static final String KEY_MD5 = "MD5";   
      
        
    /**  
         * MAC算法可選以下多種算法  
         *   
         * <pre>  
         * HmacMD5   
         * HmacSHA1   
         * HmacSHA256   
         * HmacSHA384   
         * HmacSHA512  
         * </pre>  
         
    */
      
        
    public static final String KEY_MAC = "HmacMD5";   
      
        
    /**  
         * BASE64解密  
         *   
         * 
    @param key  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static byte[] decryptBASE64(String key) throws Exception {   
            
    return (new BASE64Decoder()).decodeBuffer(key);   
        }
       
      
        
    /**  
         * BASE64加密  
         *   
         * 
    @param key  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static String encryptBASE64(byte[] key) throws Exception {   
            
    return (new BASE64Encoder()).encodeBuffer(key);   
        }
       
      
        
    /**  
         * MD5加密  
         *   
         * 
    @param data  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static byte[] encryptMD5(byte[] data) throws Exception {   
      
            MessageDigest md5 
    = MessageDigest.getInstance(KEY_MD5);   
            md5.update(data);   
      
            
    return md5.digest();   
      
        }
       
      
        
    /**  
         * SHA加密  
         *   
         * 
    @param data  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static byte[] encryptSHA(byte[] data) throws Exception {   
      
            MessageDigest sha 
    = MessageDigest.getInstance(KEY_SHA);   
            sha.update(data);   
      
            
    return sha.digest();   
      
        }
       
      
        
    /**  
         * 初始化HMAC密鑰  
         *   
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static String initMacKey() throws Exception {   
            KeyGenerator keyGenerator 
    = KeyGenerator.getInstance(KEY_MAC);   
      
            SecretKey secretKey 
    = keyGenerator.generateKey();   
            
    return encryptBASE64(secretKey.getEncoded());   
        }
       
      
        
    /**  
         * HMAC加密  
         *   
         * 
    @param data  
         * 
    @param key  
         * 
    @return  
         * 
    @throws Exception  
         
    */
      
        
    public static byte[] encryptHMAC(byte[] data, String key) throws Exception {   
      
            SecretKey secretKey 
    = new SecretKeySpec(decryptBASE64(key), KEY_MAC);   
            Mac mac 
    = Mac.getInstance(secretKey.getAlgorithm());   
            mac.init(secretKey);   
      
            
    return mac.doFinal(data);   
      
        }
       
    }

        再給出一個(gè)測試類:

    import static org.junit.Assert.*;

    import org.junit.Test;

    /**
     *
     * @author 梁棟  http://www.feng123.com
     * @version 1.0
     * @since 1.0
     */
    public class CoderTest {

        @Test
        public void test() throws Exception {
            String inputStr = "簡單加密";
            System.err.println("原文:\n" + inputStr);

            byte[] inputData = inputStr.getBytes();
            String code = Coder.encryptBASE64(inputData);

            System.err.println("BASE64加密后:\n" + code);

            byte[] output = Coder.decryptBASE64(code);

            String outputStr = new String(output);

            System.err.println("BASE64解密后:\n" + outputStr);

            // 驗(yàn)證BASE64加密解密一致性
            assertEquals(inputStr, outputStr);

            // 驗(yàn)證MD5對(duì)于同一內(nèi)容加密是否一致
            assertArrayEquals(Coder.encryptMD5(inputData), Coder
                    .encryptMD5(inputData));

            // 驗(yàn)證SHA對(duì)于同一內(nèi)容加密是否一致
            assertArrayEquals(Coder.encryptSHA(inputData), Coder
                    .encryptSHA(inputData));

            String key = Coder.initMacKey();
            System.err.println("Mac密鑰:\n" + key);

            // 驗(yàn)證HMAC對(duì)于同一內(nèi)容,同一密鑰加密是否一致
            assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(
                    inputData, key));

            BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));
            System.err.println("MD5:\n" + md5.toString(16));

            BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));
            System.err.println("SHA:\n" + sha.toString(32));

            BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));
            System.err.println("HMAC:\n" + mac.toString(16));
        }

    posted on 2009-12-18 11:38 鵬凌 閱讀(310) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 84pao强力永久免费高清| 337p日本欧洲亚洲大胆精品555588 | 亚洲国产成人AV在线播放 | 免费国产成人α片| 亚洲国产精品特色大片观看完整版| 男女一边摸一边做爽的免费视频| 久久亚洲av无码精品浪潮| 一区二区三区免费精品视频| 亚洲综合色在线观看亚洲| 九九视频高清视频免费观看| 亚洲综合另类小说色区色噜噜| 2022免费国产精品福利在线| 亚洲精品乱码久久久久久久久久久久 | 九九热久久免费视频| 国产亚洲日韩在线三区| 国产无遮挡裸体免费视频在线观看 | 亚洲欧洲久久av| 本道天堂成在人线av无码免费 | 亚洲国产成人久久综合| 免费看国产一级特黄aa大片| 四虎国产精品成人免费久久| 国产亚洲精品影视在线产品| 18禁在线无遮挡免费观看网站| 亚洲成a人片77777老司机| 7m凹凸精品分类大全免费| 亚洲午夜成激人情在线影院| 麻豆精品国产免费观看| 精品成人一区二区三区免费视频| 亚洲国产一区视频| 国产免费播放一区二区| 亚洲国产精品成人精品无码区 | 亚洲第一AAAAA片| 99视频免费观看| 亚洲综合色区中文字幕| 日本无吗免费一二区| 人妻巨大乳hd免费看| 久久久久无码精品亚洲日韩| 在线天堂免费观看.WWW| 亚洲AV无码专区国产乱码不卡| 免费看国产一级特黄aa大片| 国产午夜无码精品免费看|