zoukankan      html  css  js  c++  java
  • Java加密技术(三)——PBE算法

    Javapbe对称加密
        除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法——PBE

    PBE
        PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。是一种简便的加密方式。



    通过java代码实现如下:Coder类见 Java加密技术(一)
    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安全编码组件

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



    再给出一个测试类:
    Java代码  收藏代码
    import static org.junit.Assert.*; 
     
    import org.junit.Test; 
     
    /**

    * @author 梁栋
    * @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); 
        } 
     



    控制台输出:
    Console代码  收藏代码
    原文: abc 
    密码: efg 
    加密后: iCZ0uRtaAhE= 
     
    解密后: abc 

        后续我们会介绍非对称加密算法,如RSA、DSA、DH、ECC等。
  • 相关阅读:
    简单的模板解析函数
    HTML通过事件传递参数到js 二 event
    HTML通过事件传递参数到js一
    通过this获取当前点击选项相关数据
    LeetCode 20. 有效的括号(Valid Parentheses)
    LeetCode 459. 重复的子字符串(Repeated Substring Pattern)
    LeetCode 14. 最长公共前缀(Longest Common Prefix)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    LeetCode 171. Excel表列序号(Excel Sheet Column Number) 22
    LeetCode 665. 非递减数列(Non-decreasing Array)
  • 原文地址:https://www.cnblogs.com/iamconan/p/7383470.html
Copyright © 2011-2022 走看看