From 97100834a5bcb08f2fdf2eb6c580d3ceeb8b6b2f Mon Sep 17 00:00:00 2001 From: steckbrief Date: Sat, 16 Jul 2016 15:11:36 +0200 Subject: Implements FS#227: Store password encrypted in internal database --- .../conversationsplus/utils/SimpleCryptoUtil.java | 110 +++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/main/java/de/thedevstack/conversationsplus/utils/SimpleCryptoUtil.java (limited to 'src/main/java/de/thedevstack/conversationsplus/utils/SimpleCryptoUtil.java') diff --git a/src/main/java/de/thedevstack/conversationsplus/utils/SimpleCryptoUtil.java b/src/main/java/de/thedevstack/conversationsplus/utils/SimpleCryptoUtil.java new file mode 100644 index 00000000..0a8c80d1 --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/utils/SimpleCryptoUtil.java @@ -0,0 +1,110 @@ +package de.thedevstack.conversationsplus.utils; + + +import java.security.InvalidKeyException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; + +/** + * + */ +public final class SimpleCryptoUtil { + + public static String encrypt(String seed, String cleartext) { + String result = null; + if (null != seed && null != cleartext) { + try { + byte[] rawKey = getRawKey(seed.getBytes()); + byte[] encryptedBytes = encrypt(rawKey, cleartext.getBytes()); + result = toHex(encryptedBytes); + } catch (NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException | NoSuchPaddingException e) { + // FIXME + } + } + + return result; + } + + public static String decrypt(String seed, String encrypted) { + String result = null; + if (null != seed && null != encrypted) { + try { + byte[] rawKey = getRawKey(seed.getBytes()); + byte[] enc = toByte(encrypted); + byte[] decryptedBytes = decrypt(rawKey, enc); + result = new String(decryptedBytes); + } catch (NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException | NoSuchPaddingException e) { + // FIXME + } + } + + return result; + } + + private static byte[] encrypt(byte[] raw, byte[] clear) throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException { + byte[] encrypted = doCipherOperation(raw, clear, Cipher.ENCRYPT_MODE); + return encrypted; + } + + private static byte[] decrypt(byte[] raw, byte[] encrypted) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { + byte[] decrypted = doCipherOperation(raw, encrypted, Cipher.DECRYPT_MODE); + return decrypted; + } + + private static byte[] doCipherOperation(byte[] raw, byte[] input, int mode) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(mode, skeySpec); + + return cipher.doFinal(input); + } + + private static byte[] getRawKey(byte[] seed) throws NoSuchAlgorithmException { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] md5Bytes = md.digest(seed); // 128 Bit = 16 byte + SecretKey skey = new SecretKeySpec(md5Bytes, "AES"); + byte[] raw = skey.getEncoded(); + return raw; + } + + public static byte[] toByte(String hexString) { + int len = hexString.length() / 2; + byte[] result = new byte[len]; + for (int i = 0; i < len; i++) { + result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue(); + } + return result; + } + + public static String toHex(byte[] buf) { + if (buf == null) { + return null; + } + StringBuffer result = new StringBuffer(2 * buf.length); + for (int i = 0; i < buf.length; i++) { + appendHex(result, buf[i]); + } + return result.toString(); + } + + private final static String HEX = "0123456789ABCDEF"; + + private static void appendHex(StringBuffer sb, byte b) { + sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f)); + } + + /** + * private constructor to avoid instantiation + */ + private SimpleCryptoUtil() { + // private constructor to avoid instantiation + } +} + -- cgit v1.2.3