// Path: src/main/java/com/plexobject/rbac/Configuration.java
// public class Configuration {
//     private static final String RESOURCE_NAME = "application.properties";
//     private static final String CONFIG_DATABASE_KEY = "config.db.name";
//     private static final String PAGE_SIZE = "page.size";
//     private static final int MAX_PAGE_SIZE = 256;
//     private static final String DEFAULT_CONFIG_DATABASE = "the_config";
//     private static final Logger LOGGER = Logger.getLogger(Configuration.class);
//     private static Configuration instance = new Configuration();
// 
//     private final Properties properties = new Properties();
// 
//     Configuration() {
//         try {
//             InputStream in = getClass().getClassLoader().getResourceAsStream(
//                     RESOURCE_NAME);
//             if (in == null) {
//                 throw new RuntimeException("Failed to find " + RESOURCE_NAME);
//             }
//             properties.load(in);
//             properties.putAll(System.getProperties());
// 
//         } catch (IOException e) {
//             LOGGER.error("Failed to load " + RESOURCE_NAME, e);
//         }
//         // subject can override any property via command-line system-arguments
// 
//         properties.putAll(System.getProperties());
// 
//     }
// 
//     public static Configuration getInstance() {
//         return instance;
//     }
// 
//     public String getConfigDatabase() {
//         return getProperty(CONFIG_DATABASE_KEY, DEFAULT_CONFIG_DATABASE);
//     }
// 
//     public int getPageSize() {
//         return getInteger(PAGE_SIZE, MAX_PAGE_SIZE);
//     }
// 
//     public String getProperty(final String key) {
//         return getProperty(key, null);
//     }
// 
//     public String getProperty(final String key, final String def) {
//         return properties.getProperty(key, def);
//     }
// 
//     public int getInteger(final String key) {
//         return getInteger(key, 0);
//     }
// 
//     public int getInteger(final String key, final int def) {
//         return Integer.parseInt(getProperty(key, String.valueOf(def)));
//     }
// 
//     public double getDouble(final String key) {
//         return getDouble(key, 0);
//     }
// 
//     public double getDouble(final String key, final double def) {
//         return Double.valueOf(getProperty(key, String.valueOf(def)))
//                 .doubleValue();
//     }
// 
//     public boolean getBoolean(final String key) {
//         return getBoolean(key, false);
//     }
// 
//     public boolean getBoolean(final String key, final boolean def) {
//         return Boolean.valueOf(getProperty(key, String.valueOf(def)))
//                 .booleanValue();
//     }
// 
//     public long getLong(final String key) {
//         return getLong(key, 0);
//     }
// 
//     public long getLong(final String key, long def) {
//         return Long.valueOf(getProperty(key, String.valueOf(def)));
//     }
// 
// }


import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.Security;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKeyFactory;
import javax.crypto.ShortBufferException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import com.plexobject.rbac.Configuration;
package com.plexobject.rbac.utils;





public class PasswordUtils {
    private static final byte[] KEY_BYTES = new byte[] { 0x73, 0x2f, 0x2d,
            0x33, (byte) 0xc8, 0x01, 0x73, 0x2b, 0x72, 0x06, 0x75, 0x6c,
            (byte) 0xbd, 0x44, (byte) 0xf9, (byte) 0xc1, (byte) 0xc1, 0x03,
            (byte) 0xdd, (byte) 0xd9, 0x7c, 0x7c, (byte) 0xbe, (byte) 0x8e };
// Path: src/main/java/com/plexobject/rbac/Configuration.java
// public class Configuration {
//     private static final String RESOURCE_NAME = "application.properties";
//     private static final String CONFIG_DATABASE_KEY = "config.db.name";
//     private static final String PAGE_SIZE = "page.size";
//     private static final int MAX_PAGE_SIZE = 256;
//     private static final String DEFAULT_CONFIG_DATABASE = "the_config";
//     private static final Logger LOGGER = Logger.getLogger(Configuration.class);
//     private static Configuration instance = new Configuration();
// 
//     private final Properties properties = new Properties();
// 
//     Configuration() {
//         try {
//             InputStream in = getClass().getClassLoader().getResourceAsStream(
//                     RESOURCE_NAME);
//             if (in == null) {
//                 throw new RuntimeException("Failed to find " + RESOURCE_NAME);
//             }
//             properties.load(in);
//             properties.putAll(System.getProperties());
// 
//         } catch (IOException e) {
//             LOGGER.error("Failed to load " + RESOURCE_NAME, e);
//         }
//         // subject can override any property via command-line system-arguments
// 
//         properties.putAll(System.getProperties());
// 
//     }
// 
//     public static Configuration getInstance() {
//         return instance;
//     }
// 
//     public String getConfigDatabase() {
//         return getProperty(CONFIG_DATABASE_KEY, DEFAULT_CONFIG_DATABASE);
//     }
// 
//     public int getPageSize() {
//         return getInteger(PAGE_SIZE, MAX_PAGE_SIZE);
//     }
// 
//     public String getProperty(final String key) {
//         return getProperty(key, null);
//     }
// 
//     public String getProperty(final String key, final String def) {
//         return properties.getProperty(key, def);
//     }
// 
//     public int getInteger(final String key) {
//         return getInteger(key, 0);
//     }
// 
//     public int getInteger(final String key, final int def) {
//         return Integer.parseInt(getProperty(key, String.valueOf(def)));
//     }
// 
//     public double getDouble(final String key) {
//         return getDouble(key, 0);
//     }
// 
//     public double getDouble(final String key, final double def) {
//         return Double.valueOf(getProperty(key, String.valueOf(def)))
//                 .doubleValue();
//     }
// 
//     public boolean getBoolean(final String key) {
//         return getBoolean(key, false);
//     }
// 
//     public boolean getBoolean(final String key, final boolean def) {
//         return Boolean.valueOf(getProperty(key, String.valueOf(def)))
//                 .booleanValue();
//     }
// 
//     public long getLong(final String key) {
//         return getLong(key, 0);
//     }
// 
//     public long getLong(final String key, long def) {
//         return Long.valueOf(getProperty(key, String.valueOf(def)));
//     }
// 
// }


// Path: src/main/java/com/plexobject/rbac/utils/PasswordUtils.java
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.Security;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKeyFactory;
import javax.crypto.ShortBufferException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import com.plexobject.rbac.Configuration;

package com.plexobject.rbac.utils;





public class PasswordUtils {
    private static final byte[] KEY_BYTES = new byte[] { 0x73, 0x2f, 0x2d,
            0x33, (byte) 0xc8, 0x01, 0x73, 0x2b, 0x72, 0x06, 0x75, 0x6c,
            (byte) 0xbd, 0x44, (byte) 0xf9, (byte) 0xc1, (byte) 0xc1, 0x03,
            (byte) 0xdd, (byte) 0xd9, 0x7c, 0x7c, (byte) 0xbe, (byte) 0x8e };
    private static final String ENCRYPTION_PASSWORD = Configuration