BlogJava 聯系 聚合 管理  

          Blog Stats

          隨筆檔案


          bitmap

          bitmap

          關鍵字: java 加密基礎, base64, md5, mac, sha, 單向加密
              加密解密,曾經是我一個畢業設計的重要組件。在工作了多年以后回想當時那個加密、解密算法,實在是太單純了。
              言歸正傳,這里我們主要描述Java已經實現的一些加密解密算法,最后介紹數字證書。
              如基本的單向加密算法:
          • BASE64 嚴格地說,屬于編碼格式,而非加密算法
          • MD5(Message Digest algorithm 5,信息摘要算法)
          • SHA(Secure Hash Algorithm,安全散列算法)
          • HMAC(Hash Message Authentication Code,散列消息鑒別碼)

              復雜的對稱加密(DES、PBE)、非對稱加密算法:
          • DES(Data Encryption Standard,數據加密算法)
          • PBE(Password-based encryption,基于密碼驗證)
          • RSA(算法的名字以發明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
          • DH(Diffie-Hellman算法,密鑰一致協議)
          • DSA(Digital Signature Algorithm,數字簽名)
          • ECC(Elliptic Curves Cryptography,橢圓曲線密碼編碼學)



              本篇內容簡要介紹BASE64MD5SHAHMAC幾種方法。
              MD5SHAHMAC這三種加密算法,可謂是非可逆加密,就是不可解密的加密方法。我們通常只把他們作為加密的基礎。單純的以上三種的加密并不可靠。

          BASE64
          按照RFC2045的定義,Base64被定義為:Base64內容傳送編碼被設計用來把任意序列的8位字節描述為一種不易被人直接識別的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
          常見于郵件、http加密,截取http信息,你就會發現登錄操作的用戶名、密碼字段通過BASE64加密的。




          通過java代碼實現如下:

          /**  
           * 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兩個類,我們只需要知道使用對應的方法即可。另,BASE加密后產生的字節位數是8的倍數,如果不夠位數以=符號填充。

          MD5
          MD5 -- message-digest algorithm 5 (信息-摘要算法)縮寫,廣泛用于加密和解密技術,常用于文件校驗。校驗?不管文件多大,經過MD5后都能生成唯一的MD5值。好比現在的ISO校驗,都是MD5校驗。怎么用?當然是把ISO經過MD5后產生MD5的值。一般下載linux-ISO的朋友都見過下載鏈接旁邊放著MD5的串。就是用來驗證文件是否一致的。



          通過java代碼實現如下:

          /**  
           * 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產生的字節數組交給BASE64再加密一把,得到相應的字符串。

          SHA
          SHA(Secure Hash Algorithm,安全散列算法),數字簽名等密碼學應用中重要的工具,被廣泛地應用于電子商務等信息安全領域。雖然,SHA與MD5通過碰撞法都被破解了, 但是SHA仍然是公認的安全加密算法,較之MD5更為安全。



          通過java代碼實現如下:

           /**  
               * 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算法的認證協議。消息鑒別碼實現鑒別的原理是,用公開函數和密鑰產生一個固定長度的值作為認證標識,用這個標識鑒別消息的完整性。使用一個密鑰生成一個固定大小的小數據塊,即MAC,并將其加入到消息中,然后傳輸。接收方利用與發送方共享的密鑰進行鑒別認證等。



          通過java代碼實現如下:

          /**  
           * 初始化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);   
            
          }
            

          給出一個完整類,如下:

          import java.security.MessageDigest;   
            
          import javax.crypto.KeyGenerator;   
          import javax.crypto.Mac;   
          import javax.crypto.SecretKey;   
            
          import sun.misc.BASE64Decoder;   
          import sun.misc.BASE64Encoder;   
            
          /**  
           * 基礎加密組件  
          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);   
            
              }
             
          }
            

          再給出一個測試類:

          1. import static org.junit.Assert.*;   
          2.   
          3. import org.junit.Test;   
          4.   
          5. /**  
          6.  *   
          7.  * @author 梁棟  http://www.feng123.com
          8.  * @version 1.0  
          9.  * @since 1.0  
          10.  */  
          11. public class CoderTest {   
          12.   
          13.     @Test  
          14.     public void test() throws Exception {   
          15.         String inputStr = "簡單加密";   
          16.         System.err.println("原文:\n" + inputStr);   
          17.   
          18.         byte[] inputData = inputStr.getBytes();   
          19.         String code = Coder.encryptBASE64(inputData);   
          20.   
          21.         System.err.println("BASE64加密后:\n" + code);   
          22.   
          23.         byte[] output = Coder.decryptBASE64(code);   
          24.   
          25.         String outputStr = new String(output);   
          26.   
          27.         System.err.println("BASE64解密后:\n" + outputStr);   
          28.   
          29.         // 驗證BASE64加密解密一致性   
          30.         assertEquals(inputStr, outputStr);   
          31.   
          32.         // 驗證MD5對于同一內容加密是否一致   
          33.         assertArrayEquals(Coder.encryptMD5(inputData), Coder   
          34.                 .encryptMD5(inputData));   
          35.   
          36.         // 驗證SHA對于同一內容加密是否一致   
          37.         assertArrayEquals(Coder.encryptSHA(inputData), Coder   
          38.                 .encryptSHA(inputData));   
          39.   
          40.         String key = Coder.initMacKey();   
          41.         System.err.println("Mac密鑰:\n" + key);   
          42.   
          43.         // 驗證HMAC對于同一內容,同一密鑰加密是否一致   
          44.         assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(   
          45.                 inputData, key));   
          46.   
          47.         BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));   
          48.         System.err.println("MD5:\n" + md5.toString(16));   
          49.   
          50.         BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));   
          51.         System.err.println("SHA:\n" + sha.toString(32));   
          52.   
          53.         BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));   
          54.         System.err.println("HMAC:\n" + mac.toString(16));   
          55.     }   
          posted on 2009-07-02 21:10 bitmap 閱讀(1807) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 洛阳市| 宣城市| 布拖县| 文昌市| 嘉祥县| 吐鲁番市| 拜城县| 海门市| 汨罗市| 翁牛特旗| 江津市| 镇坪县| 云和县| 遂宁市| 乡城县| 廉江市| 革吉县| 类乌齐县| 商南县| 甘德县| 玛沁县| 廉江市| 衡东县| 肇源县| 承德县| 曲麻莱县| 岑溪市| 原平市| 五峰| 汉源县| 天长市| 房山区| 长沙市| 策勒县| 佳木斯市| 革吉县| 武清区| 桐柏县| 志丹县| 吉林市| 鄱阳县|