Java tutorial
/* * Copyright [2015] [Alexander Dridiger - drisoftie@gmail.com] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.drisoftie.cwdroid.util; import android.util.Base64; import org.apache.commons.lang3.CharEncoding; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** * @author Alexander Dridiger */ public class CredentialUtils { private static final String MD5 = "MD5"; private static final String AES = "AES"; private static Cipher getDefaultCipher() { Cipher cipher = null; try { cipher = Cipher.getInstance(AES); } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { e.printStackTrace(); } return cipher; } private static SecretKey generateKey() throws NoSuchAlgorithmException { // Generate a 256-bit key final int outputKeyLength = 256; SecureRandom secureRandom = new SecureRandom(); // Do *not* seed secureRandom! Automatically seeded from system entropy. KeyGenerator keyGenerator = KeyGenerator.getInstance(AES); keyGenerator.init(outputKeyLength, secureRandom); return keyGenerator.generateKey(); } public static byte[] generateKeyBytes() { byte[] keyBytes = null; try { keyBytes = generateKey().getEncoded(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return keyBytes; } public static String obfuscateToBase64(byte[] key, String pure) { String result = null; try { byte[] encrypted = encrypt(key, pure.getBytes()); result = Base64.encodeToString(encrypted, Base64.DEFAULT); } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException e) { e.printStackTrace(); } return result; } public static String deobfuscateFromBase64(byte[] key, String basePassword) { String result = null; try { byte[] cleared = Base64.decode(basePassword, Base64.DEFAULT); byte[] decrypted = decrypt(key, cleared); result = new String(decrypted, CharEncoding.UTF_8); } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException | UnsupportedEncodingException e) { e.printStackTrace(); } return result; } private static byte[] encrypt(byte[] key, byte[] clear) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { SecretKeySpec skeySpec = new SecretKeySpec(key, AES); Cipher cipher = getDefaultCipher(); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); return cipher.doFinal(clear); } private static byte[] decrypt(byte[] key, byte[] encrypted) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { SecretKeySpec skeySpec = new SecretKeySpec(key, AES); Cipher cipher = getDefaultCipher(); cipher.init(Cipher.DECRYPT_MODE, skeySpec); return cipher.doFinal(encrypted); } public static String md5(final String s) { try { // Create MD5 Hash MessageDigest digest = java.security.MessageDigest.getInstance(MD5); digest.update(s.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuilder hexString = new StringBuilder(); for (byte aMessageDigest : messageDigest) { String h = Integer.toHexString(0xFF & aMessageDigest); while (h.length() < 2) { h = "0" + h; } hexString.append(h); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } }