BlogJava 聯系 聚合 管理  

          Blog Stats

          隨筆檔案


          bitmap

          bitmap

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

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



          通過java代碼實現如下:

           

          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;   
              }
             
            
              
          /**  
               * 轉換密鑰<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  
               *            數據  
               * 
          @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  
               *            數據  
               * 
          @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);   
              }
             
            
          }
            

          控制臺輸出:

        1. 原文: abc   
        2. 密碼: efg   
        3. 加密后: iCZ0uRtaAhE=   
        4.   
        5. 解密后: abc  

        6.  

           

          posted on 2009-07-08 22:22 bitmap 閱讀(990) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 宜州市| 广河县| 涞水县| 吉林市| 龙海市| 常熟市| 盐山县| 万全县| 综艺| 浦北县| 沽源县| 松阳县| 太白县| 临夏县| 诏安县| 汶上县| 天柱县| 贡觉县| 米泉市| 康乐县| 错那县| 蕉岭县| 南川市| 信宜市| 东明县| 江北区| 介休市| 巴楚县| 盐源县| 信宜市| 河东区| 龙山县| 石台县| 甘洛县| 建阳市| 资中县| 日喀则市| 安庆市| 沈丘县| 江达县| 克拉玛依市|