· 8 years ago · Jan 26, 2018, 02:40 PM
1import org.apache.commons.codec.binary.Base64;
2
3import javax.crypto.*;
4import javax.crypto.spec.IvParameterSpec;
5import javax.crypto.spec.PBEKeySpec;
6import javax.crypto.spec.SecretKeySpec;
7import javax.persistence.AttributeConverter;
8import javax.persistence.Converter;
9import java.io.UnsupportedEncodingException;
10import java.nio.ByteBuffer;
11import java.security.*;
12import java.security.spec.InvalidKeySpecException;
13import java.security.spec.InvalidParameterSpecException;
14
15@Converter
16public class CryptoConverter implements AttributeConverter<String, String> {
17
18 @Override
19 public String convertToDatabaseColumn(String attribute) {
20 if(attribute == null){
21 return null;
22 }
23 try {
24 byte[] ivBytes;
25 //String password="Hello";
26 String password = EncryptionUtil.key.get();
27 SecureRandom random = new SecureRandom();
28 byte bytes[] = new byte[20];
29 random.nextBytes(bytes);
30 byte[] saltBytes = bytes;
31// Derive the key
32 SecretKeyFactory factory = null;
33
34 factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
35
36 PBEKeySpec spec = new PBEKeySpec(password.toCharArray(),saltBytes,65556,256);
37 SecretKey secretKey = factory.generateSecret(spec);
38 SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(), "AES");
39
40 //encrypting the word
41 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
42 cipher.init(Cipher.ENCRYPT_MODE, secret);
43 AlgorithmParameters params = cipher.getParameters();
44 ivBytes = params.getParameterSpec(IvParameterSpec.class).getIV();
45 byte[] encryptedTextBytes = cipher.doFinal(attribute.getBytes("UTF-8"));
46 //prepend salt and vi
47 byte[] buffer = new byte[saltBytes.length + ivBytes.length + encryptedTextBytes.length];
48 System.arraycopy(saltBytes, 0, buffer, 0, saltBytes.length);
49 System.arraycopy(ivBytes, 0, buffer, saltBytes.length, ivBytes.length);
50 System.arraycopy(encryptedTextBytes, 0, buffer, saltBytes.length + ivBytes.length, encryptedTextBytes.length);
51 return new Base64().encodeToString(buffer);
52
53 } catch (NoSuchAlgorithmException e) {
54 e.printStackTrace();
55 } catch (InvalidKeySpecException e) {
56 e.printStackTrace();
57 } catch (InvalidKeyException e) {
58 e.printStackTrace();
59 } catch (NoSuchPaddingException e) {
60 e.printStackTrace();
61 } catch (BadPaddingException e) {
62 e.printStackTrace();
63 } catch (UnsupportedEncodingException e) {
64 e.printStackTrace();
65 } catch (InvalidParameterSpecException e) {
66 e.printStackTrace();
67 } catch (IllegalBlockSizeException e) {
68 e.printStackTrace();
69 }
70
71 return null;
72 }
73
74 @Override
75 public String convertToEntityAttribute(String dbData) {
76
77 if(dbData == null){
78 return null;
79 }
80
81 try {
82 String password = EncryptionUtil.key.get();
83 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
84 //strip off the salt and iv
85 ByteBuffer buffer = ByteBuffer.wrap(new Base64().decode(dbData));
86 byte[] saltBytes = new byte[20];
87 buffer.get(saltBytes, 0, saltBytes.length);
88 byte[] ivBytes1 = new byte[cipher.getBlockSize()];
89 buffer.get(ivBytes1, 0, ivBytes1.length);
90 byte[] encryptedTextBytes = new byte[buffer.capacity() - saltBytes.length - ivBytes1.length];
91
92 buffer.get(encryptedTextBytes);
93 // Deriving the key
94 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
95 PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), saltBytes, 65556, 256);
96 SecretKey secretKey = factory.generateSecret(spec);
97 SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(), "AES");
98 cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(ivBytes1));
99 byte[] decryptedTextBytes = null;
100
101 decryptedTextBytes = cipher.doFinal(encryptedTextBytes);
102
103
104 return new String(decryptedTextBytes);
105
106 } catch (IllegalBlockSizeException e) {
107 e.printStackTrace();
108 } catch (BadPaddingException e) {
109 e.printStackTrace();
110 } catch (NoSuchAlgorithmException e) {
111 e.printStackTrace();
112 } catch (InvalidKeyException e) {
113 e.printStackTrace();
114 } catch (InvalidAlgorithmParameterException e) {
115 e.printStackTrace();
116 } catch (NoSuchPaddingException e) {
117 e.printStackTrace();
118 } catch (InvalidKeySpecException e) {
119 e.printStackTrace();
120 }
121 return null;
122 }
123}