PBKDF2
/***
* PBKDF2 加密
*
* @param password
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
*/
public static String encryptPBKDF2(String password) {
try {
int iterations = 1000;
char[] chars = password.toCharArray();
byte[] salt = getSalt().getBytes();
PBEKeySpec spec = new PBEKeySpec(chars, salt, iterations, 64 * 8);
SecretKeyFactory skf = SecretKeyFactory
.getInstance("PBKDF2WithHmacSHA1");
byte[] hash = skf.generateSecret(spec).getEncoded();
password = toHex(hash);// iterations + ":" + toHex(salt) + ":" +
// toHex(hash);
} catch (NoSuchAlgorithmException e) {
// e.printStackTrace();
log.error(e);
password = "";
} catch (InvalidKeySpecException e) {
// e.printStackTrace();
log.error(e);
password = "";
}
return password;
}
private static SecureRandom sr = null;
private static byte[] salt = new byte[1];
/**
* 获取盐值
*
* @return
* @throws NoSuchAlgorithmException
*/
private static String getSalt() throws NoSuchAlgorithmException {
if (sr == null) {
synchronized (KEY) {
if (sr == null)
sr = SecureRandom.getInstance("SHA1PRNG");
}
}
sr.nextBytes(salt);
return salt.toString();
}
/**
*
* @param array
* @return
* @throws NoSuchAlgorithmException
*/
private static String toHex(byte[] array) throws NoSuchAlgorithmException {
BigInteger bi = new BigInteger(1, array);
String hex = bi.toString(16);
int paddingLength = (array.length * 2) - hex.length();
if (paddingLength > 0) {
return String.format("%0" + paddingLength + "d", 0) + hex;
} else {
return hex;
}
}