com.gvmax.common.util.Enc.java Source code

Java tutorial

Introduction

Here is the source code for com.gvmax.common.util.Enc.java

Source

/*******************************************************************************
 * Copyright (c) 2013 Hani Naguib.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Contributors:
 *     Hani Naguib - initial API and implementation
 ******************************************************************************/
package com.gvmax.common.util;

import java.security.Key;
import java.security.spec.KeySpec;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;

/**
 * Utility used to encrypt and decrypt values.
 * If the provided password isBlank than encryption is disabled.
 */
public class Enc {
    private static final Logger logger = Logger.getLogger(Enc.class);
    /** Is encruption enabled */
    private boolean enabled;
    /** Key to use */
    private Key key;
    /** Cipher to use */
    private Cipher c;

    private static byte[] salt = { (byte) 0x19, (byte) 0x73, (byte) 0x41, (byte) 0x8c, (byte) 0x7e, (byte) 0xd8,
            (byte) 0xee, (byte) 0x89 };
    private static byte[] iv = { (byte) 0x19, (byte) 0x73, (byte) 0x41, (byte) 0x8c, (byte) 0x7e, (byte) 0xd8,
            (byte) 0xee, (byte) 0x89, (byte) 0x19, (byte) 0x73, (byte) 0x41, (byte) 0x8c, (byte) 0x7e, (byte) 0xd8,
            (byte) 0xee, (byte) 0x89 };

    // --------------
    // CONSTRUCTORS
    // --------------

    public Enc(String password) {
        this(password, 256);
    }

    public Enc(String password, int keyLength) {
        if (password == null || password.trim().equals("")) {
            enabled = false;
        } else {
            enabled = true;
            try {
                SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
                KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 1024, keyLength);
                key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
                c = Cipher.getInstance("AES/CBC/PKCS5Padding");
            } catch (Exception e) {
                logger.error(e);
            }
        }
    }

    // ------------
    // ENC/DEC
    // ------------

    public String encrypt(String valueToEnc) {
        if (!enabled) {
            return valueToEnc;
        }
        if (valueToEnc == null) {
            return null;
        }
        try {
            c.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
            byte[] encValue = c.doFinal(valueToEnc.getBytes("UTF-8"));
            return Base64.encodeBase64String(encValue);
        } catch (Exception e) {
            logger.warn("Unable to encrypt: " + valueToEnc, e);
            return null;
        }
    }

    public String decrypt(String encryptedValue) {
        if (!enabled) {
            return encryptedValue;
        }
        byte[] val = decryptByte(encryptedValue);
        if (val == null) {
            return null;
        }
        return StringUtil.toString(val);
    }

    public byte[] decryptByte(String encryptedValue) {
        if (encryptedValue == null) {
            return null;
        }
        if (!enabled) {
            return StringUtil.getBytes(encryptedValue);
        }
        try {
            c.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
            byte[] decordedValue = Base64.decodeBase64(encryptedValue);
            return c.doFinal(decordedValue);
        } catch (Exception e) {
            logger.warn("Unable to decrypt: " + encryptedValue, e);
            return null;
        }
    }

}