· 6 years ago · Mar 26, 2019, 12:44 PM
1public class KeyChainUtils {
2 private static KeyChainUtils instance;
3 private KeyStore keyStore;
4 public SecretKey key;
5 private static Object mutex=new Object();
6
7 public static KeyChainUtils getInstance() {
8 if(instance==null){
9 synchronized (mutex) {
10 instance = new KeyChainUtils();
11 }
12 }
13 return instance;
14 }
15
16 private KeyChainUtils(){
17 init();
18 }
19
20
21 public void init(){
22 try{
23 // Get Keystore
24 keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
25 SharedPreferences keyPreference = PreferenceManager.getDefaultSharedPreferences(MyApplication.getApplication());
26 boolean isFirstRun = keyPreference.getBoolean("FIRSTRUN", true);
27 if (isFirstRun)
28 {
29 SharedPreferences.Editor editor = keyPreference.edit();
30 editor.putBoolean("FIRSTRUN", false);
31 editor.commit();
32 keyStore.load(null, getPass());
33 generateKey();
34 Log.e("Key","created");
35 } else {
36 getKey();
37 Log.e("Key","Already created");
38 }
39 }
40 catch(Exception ex){
41 ex.printStackTrace();
42 }
43 }
44
45
46 void generateKey(){
47 try {
48 // Get and Convert the Key
49 key = KeyGenerator.getInstance("AES").generateKey();
50 saveKey();
51 }
52 catch(Exception ex){
53 ex.printStackTrace();
54 }
55 }
56
57 void saveKey(){
58 try{
59 // Save my secret key
60 KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(key);
61 keyStore.setEntry("ECAlias", secretKeyEntry,null);
62 // Save the keystore
63 FileOutputStream fos = new FileOutputStream(MyApplication.getApplication().getFilesDir().getAbsolutePath() + "/ECK");
64 keyStore.store(fos, getPass());
65 }
66 catch(Exception ex){
67 ex.printStackTrace();
68 }
69 }
70
71 public SecretKey getKey(){
72 try{
73 if(key==null) {
74 // Load Keystore
75 FileInputStream fis = new FileInputStream(MyApplication.getApplication().getFilesDir().getAbsolutePath() + "/ECK");
76 keyStore.load(fis, getPass());
77 // Load the secret key
78 KeyStore.SecretKeyEntry secretKeyEntry = (KeyStore.SecretKeyEntry) keyStore.getEntry("ECAlias", null);
79 key = secretKeyEntry.getSecretKey();
80 }
81 }
82 catch(Exception ex){
83 ex.printStackTrace();
84 MyApplication.getApplication().logOutOnSessionTimeOut();
85 }
86 return key;
87 }
88
89 private char[] getPass() {
90 SharedPreferences keyPreference = PreferenceManager.getDefaultSharedPreferences(MyApplication.getApplication());
91 String keyPass=keyPreference.getString("keyPassEC","");
92 if(TextUtils.isEmpty(keyPass)){
93 String digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
94 SecureRandom rnd = new SecureRandom();
95 StringBuilder sb = new StringBuilder(16);
96 for (int i = 0; i < 16; i++)
97 sb.append(digits.charAt(rnd.nextInt(digits.length())));
98 keyPass=sb.toString();
99 keyPreference.edit().putString("keyPassEC",keyPass).apply();
100 }
101 return keyPass.toCharArray();
102 }