zoukankan      html  css  js  c++  java
  • java-信息安全(三)-PBE加密算法

    概述

    信息安全基本概念:

    • PBE算法(Password Based Encryption,基于口令加密)

    PBE

      PBE算法(Password Based Encryption,基于口令加密)是一种基于口令的加密算法,其特点是使用口令代替了密钥,而口令由用户自己掌管,采用随机数杂凑多重加密等方法保证数据的安全性。

      PBE算法在加密过程中并不是直接使用口令来加密,而是加密的密钥由口令生成,这个功能由PBE算法中的KDF函数完成。KDF函数的实现过程为:将用户输入的口令首先通过“盐”(salt)的扰乱产生准密钥,再将准密钥经过散列函数多次迭代后生成最终加密密钥,密钥生成后,PBE算法再选用对称加密算法对数据进行加密,可以选择DES、3DES、RC5等对称加密算法.

    示例代码

    复制代码
    package com.jd.order.util.encryption;
    
    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;
    
    import org.apache.commons.codec.binary.Base64;
    /**
     * PBE 算法
     * @author 木子旭
     * @since 2017年3月14日上午11:56:24
     * @version %I%,%G%
     */
    public class PBECoder {
        /**
         * 支持以下任意一种算法
         * 
         * <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);
        }
    
        public static byte[] decryptBASE64(String data) {
            return Base64.decodeBase64(data);
        }
    
        public static String encryptBASE64(byte[] data) {
            return new String(Base64.encodeBase64(data));
        }
    }
    复制代码

    测试

    复制代码
        @Test
        public void testEncrypt() 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
    加密后: 2HHOshH9xMI=
    解密后: abc

    参看:

    http://snowolf.iteye.com/blog/380034

    百度百科等

  • 相关阅读:
    Delphi XE5 android 蓝牙通讯传输
    Delphi XE5 android toast
    Delphi XE5 android openurl(转)
    Delphi XE5 如何设计并使用FireMonkeyStyle(转)
    Delphi XE5 android 捕获几个事件
    Delphi XE5 android listview
    Delphi XE5 android 黑屏的临时解决办法
    Delphi XE5 android popumenu
    Delphi XE5 android 获取网络状态
    Delphi XE5 android 获取电池电量
  • 原文地址:https://www.cnblogs.com/guweiwei/p/8005717.html
Copyright © 2011-2022 走看看