/*******************************************************************************
* ===========================================================
* Ankush : Big Data Cluster Management Solution
* ===========================================================
*
* (C) Copyright 2014, by Impetus Technologies
*
* This is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License (LGPL v3) as
* published by the Free Software Foundation;
*
* This software is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this software; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
******************************************************************************/
package com.impetus.ankush.common.utils;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* The Class PasswordUtil.
*/
public class PasswordUtil {
/** The Constant DEFAULT_DIGITS. */
private static final char[] DEFAULT_DIGITS = { '0', '1', '2', '3', '4',
'5', '6', '7', '8', '9' };
/** The Constant DEFAULT_SMALL_CASE_CHARS. */
private static final char[] DEFAULT_SMALL_CASE_CHARS = { 'a', 'b', 'c',
'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
/** The Constant DEFAULT_CAPITAL_CASE_CHARS. */
private static final char[] DEFAULT_CAPITAL_CASE_CHARS = { 'A', 'B', 'C',
'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
/** The Constant DEFAULT_SPECIAL_CHARS. */
private static final char[] DEFAULT_SPECIAL_CHARS = { '~', '!', '@', '#',
'$', '%', '^', '&', '_', '-', '+' };
// ,. :; '"` *? \/ ()[]{}<> //@&$
/**
* Gets the random password.
*
* @param length the length
* @return the random password
*/
public static String getRandomPassword(int length) {
return getRandomPassword(length, DEFAULT_DIGITS,
DEFAULT_SMALL_CASE_CHARS, DEFAULT_CAPITAL_CASE_CHARS, null);
}
/**
* Gets the random password.
*
* @param length the length
* @param smallChars the small chars
* @param capsChars the caps chars
* @param digits the digits
* @param specialChars the special chars
* @return the random password
*/
private static String getRandomPassword(int length, char[] smallChars,
char[] capsChars, char[] digits, char[] specialChars) {
char[][] charsArrArr = { smallChars, capsChars, digits, specialChars };
String password = null;
final int charSetCategories = 4;
StringBuilder passwordGenBuff = new StringBuilder();
Random r = new Random();
int arrIdx[] = new int[charSetCategories];
for (int pos = 0; pos < charSetCategories; ++pos) {
arrIdx[pos] = 0;
}
while (passwordGenBuff.length() < length) {
int setIdx = r.nextInt(charSetCategories);
char[] chArr = charsArrArr[setIdx];
if ((chArr == null) || (chArr.length == 0)) {
continue;
} else {
int generatedPasswordLength = passwordGenBuff.length();
int untouchedSetCount = 0;
if (generatedPasswordLength > 0) {
for (int idx = 0; idx < charSetCategories; idx++) {
char[] currArr = charsArrArr[idx];
if ((currArr != null) && (currArr.length > 0)) {
if (arrIdx[idx] == 0) {
++untouchedSetCount;
}
}
}
if ((untouchedSetCount >= (length - generatedPasswordLength))
&& (arrIdx[setIdx] > 0)) {
continue;
}
}
passwordGenBuff.append(RandomStringUtils.random(1, chArr));
++arrIdx[setIdx];
}
}
password = passwordGenBuff.toString();
if (r.nextInt() % 2 == 0) {
password = StringUtils.reverse(password);
}
return passwordGenBuff.toString();
}
/** The Constant ENCODED_PASSWORD_KEY. */
private static final String ENCODED_PASSWORD_KEY = "QU1OQUtJVUxTQ0hPTkZJRw==";
/**
* Class that provides encryption/decryption services.
*/
/**
* Logger.
*/
private static final Log LOG = LogFactory.getLog(PasswordUtil.class);
/** Base64 encoded. */
private static final byte[] SECRET_KEY = Base64
.decodeBase64(ENCODED_PASSWORD_KEY);
/** Cipher for encryption/decryption. */
private Cipher cipher;
/**
* Initialize the cipher object.
*/
public PasswordUtil() {
try {
cipher = Cipher.getInstance("AES");
} catch (Exception e) {
LOG.debug("Exception :", e);
throw new RuntimeException(e);
}
}
/**
* Encrypt the given string.
*
* @param rawstring string to encrypt
* @return encrypted string.
*/
public String encrypt(final String rawstring) {
try {
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(SECRET_KEY,
"AES"));
byte[] encrypted = cipher.doFinal(rawstring.getBytes());
LOG.debug("Encrypting Password.. ");
return Base64.encodeBase64String(encrypted).trim();
} catch (Exception e) {
LOG.debug("Exception : ", e);
return null;
}
}
/**
* Decrypt the given string.
*
* @param encryptedString string to decrypt
* @return decrypted string.
*/
public String decrypt(final String encryptedString) {
try {
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(SECRET_KEY,
"AES"));
byte[] originalPasswordBytes = cipher.doFinal(Base64
.decodeBase64(encryptedString));
LOG.debug("Decrypting Password.. ");
return new String(originalPasswordBytes);
} catch (Exception e) {
LOG.debug("Exception :", e);
return null;
}
}
}