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

          常用鏈接

          留言簿(6)

          我參與的團(tuán)隊

          隨筆分類(88)

          隨筆檔案(92)

          文章分類(142)

          文章檔案(182)

          天基成員

          學(xué)習(xí)園

          我的海角

          搜索

          •  

          積分與排名

          • 積分 - 183418
          • 排名 - 319

          最新評論

            加密解密,曾經(jīng)是我一個畢業(yè)設(shè)計的重要組件。在工作了多年以后回想當(dāng)時那個加密、解密算法,實在是太單純了。
              言歸正傳,這里我們主要描述Java已經(jīng)實現(xiàn)的一些加密解密算法,最后介紹數(shù)字證書。
              如基本的單向加密算法:
              ●  BASE64 嚴(yán)格地說,屬于編碼格式,而非加密算法
              ●  MD5(Message Digest algorithm 5,信息摘要算法)
              ●  SHA(Secure Hash Algorithm,安全散列算法)
              ●  HMAC(Hash Message Authentication Code,散列消息鑒別碼)
              復(fù)雜的對稱加密(DES、PBE)、非對稱加密算法:
              ●  DES(Data Encryption Standard,數(shù)據(jù)加密算法)
              ●  PBE(Password-based encryption,基于密碼驗證)
              ●  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è)計用來把任意序列的8位字節(jié)描述為一種不易被人直接識別的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
              常見于郵件、http加密,截取http信息,你就會發(fā)現(xiàn)登錄操作的用戶名、密碼字段通過BASE64加密的。
              通過java代碼實現(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兩個類,我們只需要知道使用對應(yīng)的方法即可。另,BASE加密后產(chǎn)生的字節(jié)位數(shù)是8的倍數(shù),如果不夠位數(shù)以=符號填充。
              MD5
              MD5 —— message-digest algorithm 5 (信息-摘要算法)縮寫,廣泛用于加密和解密技術(shù),常用于文件校驗。校驗?不管文件多大,經(jīng)過MD5后都能生成唯一的MD5值。好比現(xiàn)在的ISO校驗,都是MD5校驗。怎么用?當(dāng)然是把ISO經(jīng)過MD5后產(chǎn)生MD5的值。一般下載linux-ISO的朋友都見過下載鏈接旁邊放著MD5的串。就是用來驗證文件是否一致的。
              通過java代碼實現(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代碼實現(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é)議。消息鑒別碼實現(xiàn)鑒別的原理是,用公開函數(shù)和密鑰產(chǎn)生一個固定長度的值作為認(rèn)證標(biāo)識,用這個標(biāo)識鑒別消息的完整性。使用一個密鑰生成一個固定大小的小數(shù)據(jù)塊,即MAC,并將其加入到消息中,然后傳輸。接收方利用與發(fā)送方共享的密鑰進(jìn)行鑒別認(rèn)證等。

              通過java代碼實現(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);   
            
          }
           

              給出一個完整類,如下:

          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);   
            
              }
             
          }

              再給出一個測試類:

          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);

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

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

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

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

                  // 驗證HMAC對于同一內(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 鵬凌 閱讀(314) 評論(0)  編輯  收藏

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 通许县| 庄浪县| 介休市| 铁岭市| 新闻| 安化县| 克什克腾旗| 扶余县| 冕宁县| 乌拉特后旗| 老河口市| 武清区| 乐平市| 于都县| 新建县| 南乐县| 花垣县| 乌恰县| 平阳县| 靖安县| 盖州市| 平和县| 三江| 宁蒗| 锦屏县| 鹤壁市| 富阳市| 舟曲县| 宣汉县| 平度市| 甘孜| 望奎县| 海淀区| 通江县| 嘉义县| 砀山县| 曲靖市| 岚皋县| 桦甸市| 台安县| 铁力市|