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

          常用鏈接

          留言簿(6)

          我參與的團隊

          隨筆分類(88)

          隨筆檔案(92)

          文章分類(142)

          文章檔案(182)

          天基成員

          學習園

          我的海角

          搜索

          •  

          積分與排名

          • 積分 - 183507
          • 排名 - 319

          最新評論


              除了DES,我們還知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多種對稱加密方式,其實現(xiàn)方式大同小異,這里介紹對稱加密的另一個算法——PBE

              PBE

              PBE——Password-based encryption(基于密碼加密)。其特點在于口令由用戶自己掌管,不借助任何物理媒體;采用隨機數(shù)(這里我們叫做鹽)雜湊多重加密等方法保證數(shù)據(jù)的安全性。是一種簡便的加密方式。

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

          import java.security.Key;   
          import java.util.Random;   
            
          import javax.crypto.Cipher;   
          import javax.crypto.SecretKey;   
          import javax.crypto.SecretKeyFactory;   
          import javax.crypto.spec.PBEKeySpec;   
          import javax.crypto.spec.PBEParameterSpec;   
            
          /**  
           * PBE安全編碼組件 
          http://www.bt285.cn   http://www.5a520.cn 
           *   
           * 
          @author 梁棟  
           * 
          @version 1.0  
           * 
          @since 1.0  
           
          */
            
          public abstract class PBECoder extends Coder {   
              
          /**  
               * 支持以下任意一種算法  
               *   
               * <pre>  
               * PBEWithMD5AndDES   
               * PBEWithMD5AndTripleDES   
               * PBEWithSHA1AndDESede  
               * PBEWithSHA1AndRC2_40  
               * </pre>  
               
          */
            
              
          public static final String ALGORITHM = "PBEWITHMD5andDES";   
            
              
          /**  
               * 鹽初始化  
               *   
               * 
          @return  
               * 
          @throws Exception  
               
          */
            
              
          public static byte[] initSalt() throws Exception {   
                  
          byte[] salt = new byte[8];   
                  Random random 
          = new Random();   
                  random.nextBytes(salt);   
                  
          return salt;   
              }
             
            
              
          /**  
               * 轉(zhuǎn)換密鑰<br>  
               *   
               * 
          @param password  
               * 
          @return  
               * 
          @throws Exception  
               
          */
            
              
          private static Key toKey(String password) throws Exception {   
                  PBEKeySpec keySpec 
          = new PBEKeySpec(password.toCharArray());   
                  SecretKeyFactory keyFactory 
          = SecretKeyFactory.getInstance(ALGORITHM);   
                  SecretKey secretKey 
          = keyFactory.generateSecret(keySpec);   
            
                  
          return secretKey;   
              }
             
            
              
          /**  
               * 加密  
               *   
               * 
          @param data  
               *            數(shù)據(jù)  
               * 
          @param password  
               *            密碼  
               * 
          @param salt  
               *            鹽  
               * 
          @return  
               * 
          @throws Exception  
               
          */
            
              
          public static byte[] encrypt(byte[] data, String password, byte[] salt)   
                      
          throws Exception {   
            
                  Key key 
          = toKey(password);   
            
                  PBEParameterSpec paramSpec 
          = new PBEParameterSpec(salt, 100);   
                  Cipher cipher 
          = Cipher.getInstance(ALGORITHM);   
                  cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);   
            
                  
          return cipher.doFinal(data);   
            
              }
             
            
              
          /**  
               * 解密  
               *   
               * 
          @param data  
               *            數(shù)據(jù)  
               * 
          @param password  
               *            密碼  
               * 
          @param salt  
               *            鹽  
               * 
          @return  
               * 
          @throws Exception  
               
          */
            
              
          public static byte[] decrypt(byte[] data, String password, byte[] salt)   
                      
          throws Exception {   
            
                  Key key 
          = toKey(password);   
            
                  PBEParameterSpec paramSpec 
          = new PBEParameterSpec(salt, 100);   
                  Cipher cipher 
          = Cipher.getInstance(ALGORITHM);   
                  cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);   
            
                  
          return cipher.doFinal(data);   
            
              }
             
          }
           

              再給出一個測試類:

          import static org.junit.Assert.*;   
            
          import org.junit.Test;   
            
          /**  
           *   
           * 
          @author 梁棟  http://www.5a520.cn http://www.feng123.com
           * 
          @version 1.0  
           * 
          @since 1.0  
           
          */
            
          public class PBECoderTest {   
            
              @Test  
              
          public void test() throws Exception {   
                  String inputStr 
          = "abc";   
                  System.err.println(
          "原文: " + inputStr);   
                  
          byte[] input = inputStr.getBytes();   
            
                  String pwd 
          = "efg";   
                  System.err.println(
          "密碼: " + pwd);   
            
                  
          byte[] salt = PBECoder.initSalt();   
            
                  
          byte[] data = PBECoder.encrypt(input, pwd, salt);   
            
                  System.err.println(
          "加密后: " + PBECoder.encryptBASE64(data));   
            
                  
          byte[] output = PBECoder.decrypt(data, pwd, salt);   
                  String outputStr 
          = new String(output);   
            
                  System.err.println(
          "解密后: " + outputStr);   
                  assertEquals(inputStr, outputStr);   
              }
             
            
          }

              控制臺輸出:

              原文: abc

              密碼: efg

              加密后: iCZ0uRtaAhE=

              解密后: abc

          posted on 2009-12-19 10:20 鵬凌 閱讀(319) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 新郑市| 香港| 克东县| 福清市| 义马市| 凤庆县| 虞城县| 兴义市| 班戈县| 闸北区| 普陀区| 鹤山市| 昌江| 通河县| 长乐市| 新昌县| 普陀区| 漳州市| SHOW| 巩留县| 成都市| 岳阳县| 平湖市| 咸阳市| 越西县| 塔河县| 盐池县| 荆门市| 贺兰县| 习水县| 赤城县| 城口县| 赤峰市| 宜阳县| 武乡县| 射阳县| 电白县| 新宁县| 北海市| 赫章县| 苍溪县|