// Path: src/main/java/com/wind/common/StringUtil.java
// public class StringUtil {
// 
//     /**
//      * 判断字符串是否为null或空字符串
//      * @param str
//      * @return
//      */
//     public static boolean isNotBlank(String str){
//         return str != null && !"".equals(str.trim());
//     }
// 
// 
//     /**
//      * url编码
//      * @param str
//      * @return
//      */
//     public static String encodeUrl(String str){
//         String s = null;
//         try {
//             s = URLEncoder.encode(str, Constants.UTF8);
//         } catch (UnsupportedEncodingException e) {
//             e.printStackTrace();
//         }
// 
//         return s;
//     }
// 
//     /**
//      * url解码
//      * @param str
//      * @return
//      */
//     public static String decodeUrl(String str){
//         String s = null;
//         try {
//             s = URLDecoder.decode(str, Constants.UTF8);
//         } catch (UnsupportedEncodingException e) {
//             e.printStackTrace();
//         }
//         return s;
//     }
// 
// 
//     /**
//      * 字符串分隔 StringTokenizer效率是三种分隔方法中最快的
//      * @param str
//      * @param sign
//      * @return
//      */
//     public static String[] split(String str, String sign){
//         if(str == null){
//             return new String[]{};
//         }
//         StringTokenizer token = new StringTokenizer(str,sign);
//         String[] strArr = new String[token.countTokens()];
//         int i = 0;
//         while(token.hasMoreElements()){
//             strArr[i] = token.nextElement().toString();
//             i++;
//         }
//         return strArr;
//     }
// 
//     /**
//      * 字符串拼接
//      * @param sign
//      * @param strArr
//      * @return
//      */
//     public static String joinStr(String sign, String... strArr){
//         Optional<String> optional  = Arrays.stream(strArr).filter(Objects::nonNull
//         ).reduce((a, b) -> a + sign + b);
//         return optional.orElse("");
//     }
// }


import com.wind.common.StringUtil;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.math.BigInteger;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
package com.wind.encrypt;



/**
 * @Title: CryptoUtil
 * @Package com.wind.encrypt
 * @Description: PBKDF2
 * @author wind
 * @date 2018/10/11 10:12
 * @version V1.0
 */
public class CryptoUtil {

    public static final String PBKDF2_ALGORITHM = "PBKDF2WithHmacSHA1";

    /**
     * The following constants may be changed without breaking existing hashes.
     */
    public static final int SALT_BYTE_SIZE = 24;
    public static final int HASH_BYTE_SIZE = 24;
    public static final int PBKDF2_ITERATIONS = 1000;

    public static final int ITERATION_INDEX = 0;
    public static final int SALT_INDEX = 1;
    public static final int PBKDF2_INDEX = 2;

    public static final int PWD_SALT_LEN = 2;

    /**
     * Returns a salted PBKDF2 hash of the password.
     *
     * @param password
     *            the password to hash
     * @return a salted PBKDF2 hash of the password 数组第一个元素是密码,第二个元素是hash次数和随机盐
     */
    public static String[] createHash(String password) throws NoSuchAlgorithmException, InvalidKeySpecException {
// Path: src/main/java/com/wind/common/StringUtil.java
// public class StringUtil {
// 
//     /**
//      * 判断字符串是否为null或空字符串
//      * @param str
//      * @return
//      */
//     public static boolean isNotBlank(String str){
//         return str != null && !"".equals(str.trim());
//     }
// 
// 
//     /**
//      * url编码
//      * @param str
//      * @return
//      */
//     public static String encodeUrl(String str){
//         String s = null;
//         try {
//             s = URLEncoder.encode(str, Constants.UTF8);
//         } catch (UnsupportedEncodingException e) {
//             e.printStackTrace();
//         }
// 
//         return s;
//     }
// 
//     /**
//      * url解码
//      * @param str
//      * @return
//      */
//     public static String decodeUrl(String str){
//         String s = null;
//         try {
//             s = URLDecoder.decode(str, Constants.UTF8);
//         } catch (UnsupportedEncodingException e) {
//             e.printStackTrace();
//         }
//         return s;
//     }
// 
// 
//     /**
//      * 字符串分隔 StringTokenizer效率是三种分隔方法中最快的
//      * @param str
//      * @param sign
//      * @return
//      */
//     public static String[] split(String str, String sign){
//         if(str == null){
//             return new String[]{};
//         }
//         StringTokenizer token = new StringTokenizer(str,sign);
//         String[] strArr = new String[token.countTokens()];
//         int i = 0;
//         while(token.hasMoreElements()){
//             strArr[i] = token.nextElement().toString();
//             i++;
//         }
//         return strArr;
//     }
// 
//     /**
//      * 字符串拼接
//      * @param sign
//      * @param strArr
//      * @return
//      */
//     public static String joinStr(String sign, String... strArr){
//         Optional<String> optional  = Arrays.stream(strArr).filter(Objects::nonNull
//         ).reduce((a, b) -> a + sign + b);
//         return optional.orElse("");
//     }
// }


// Path: src/main/java/com/wind/encrypt/CryptoUtil.java
import com.wind.common.StringUtil;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.math.BigInteger;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;

package com.wind.encrypt;



/**
 * @Title: CryptoUtil
 * @Package com.wind.encrypt
 * @Description: PBKDF2
 * @author wind
 * @date 2018/10/11 10:12
 * @version V1.0
 */
public class CryptoUtil {

    public static final String PBKDF2_ALGORITHM = "PBKDF2WithHmacSHA1";

    /**
     * The following constants may be changed without breaking existing hashes.
     */
    public static final int SALT_BYTE_SIZE = 24;
    public static final int HASH_BYTE_SIZE = 24;
    public static final int PBKDF2_ITERATIONS = 1000;

    public static final int ITERATION_INDEX = 0;
    public static final int SALT_INDEX = 1;
    public static final int PBKDF2_INDEX = 2;

    public static final int PWD_SALT_LEN = 2;

    /**
     * Returns a salted PBKDF2 hash of the password.
     *
     * @param password
     *            the password to hash
     * @return a salted PBKDF2 hash of the password 数组第一个元素是密码,第二个元素是hash次数和随机盐
     */
    public static String[] createHash(String password) throws NoSuchAlgorithmException, InvalidKeySpecException {
        if (!StringUtil.isNotBlank(password)) {