· 6 years ago · Oct 13, 2019, 10:41 PM
1fun hashAndSavePasswordHash(context: Context, clearPassword: String) {
2 val digest = MessageDigest.getInstance("SHA-1")
3 val result = digest.digest(clearPassword.toByteArray(Charsets.UTF_8))
4 val sb = StringBuilder()
5 for (b in result) {
6 sb.append(String.format("%02X", b))
7 }
8 val hashedPassword = sb.toString()
9 val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)
10 val editor = sharedPref.edit()
11 editor.putString("password_hash", hashedPassword)
12 editor.apply()
13}
14
15fun getSavedPasswordHash(context: Context): String {
16 val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)
17 return if (sharedPref.contains("password_hash"))
18 sharedPref.getString("password_hash", "")!!
19 else
20 ""
21}
22
23fun getHashForString(context: Context, stringToHash: String): String {
24 val digest = MessageDigest.getInstance("SHA-1")
25 val result = digest.digest(stringToHash.toByteArray(Charsets.UTF_8))
26 val sb = StringBuilder()
27 for (b in result) {
28 sb.append(String.format("%02X", b))
29 }
30 val hashedString = sb.toString()
31 return hashedString
32}
33
34fun encryptAndSavePassword(context:Context, strToEncrypt: String): ByteArray {
35 val plainText = strToEncrypt.toByteArray(Charsets.UTF_8)
36 val keygen = KeyGenerator.getInstance("AES")
37 keygen.init(256)
38 val key = keygen.generateKey()
39 saveSecretKey(context, key)
40 val cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING")
41 cipher.init(Cipher.ENCRYPT_MODE, key)
42 val cipherText = cipher.doFinal(plainText)
43 saveInitializationVector(context, cipher.iv)
44
45 val baos = ByteArrayOutputStream()
46 val oos = ObjectOutputStream(baos)
47 oos.writeObject(cipherText)
48 val strToSave = String(android.util.Base64.encode(baos.toByteArray(), android.util.Base64.DEFAULT))
49 val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)
50 val editor = sharedPref.edit()
51 editor.putString("encrypted_password", strToSave)
52 editor.apply()
53
54 return cipherText
55}
56
57fun getDecryptedPassword(context: Context): String {
58 val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)
59 val strEncryptedPassword = sharedPref.getString("encrypted_password", "")
60 val bytes = android.util.Base64.decode(strEncryptedPassword, android.util.Base64.DEFAULT)
61 val ois = ObjectInputStream(ByteArrayInputStream(bytes))
62 val passwordToDecryptByteArray = ois.readObject() as ByteArray
63 val decryptedPasswordByteArray = decrypt(context, passwordToDecryptByteArray)
64
65 val decryptedPassword = StringBuilder()
66 for (b in decryptedPasswordByteArray) {
67 decryptedPassword.append(b.toChar())
68 }
69
70 return decryptedPassword.toString()
71}
72
73private fun decrypt(context:Context, dataToDecrypt: ByteArray): ByteArray {
74 val cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING")
75 val ivSpec = IvParameterSpec(getSavedInitializationVector(context))
76 cipher.init(Cipher.DECRYPT_MODE, getSavedSecretKey(context), ivSpec)
77 val cipherText = cipher.doFinal(dataToDecrypt)
78
79 /*val sb = StringBuilder()
80 for (b in cipherText) {
81 sb.append(b.toChar())
82 }
83 Toast.makeText(context, "dbg decrypted = [" + sb.toString() + "]", Toast.LENGTH_LONG).show()*/
84
85 return cipherText
86}
87
88private fun saveSecretKey(context:Context, secretKey: SecretKey) {
89 val baos = ByteArrayOutputStream()
90 val oos = ObjectOutputStream(baos)
91 oos.writeObject(secretKey)
92 val strToSave = String(android.util.Base64.encode(baos.toByteArray(), android.util.Base64.DEFAULT))
93 val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)
94 val editor = sharedPref.edit()
95 editor.putString("secret_key", strToSave)
96 editor.apply()
97}
98
99private fun getSavedSecretKey(context: Context): SecretKey {
100 val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)
101 val strSecretKey = sharedPref.getString("secret_key", "")
102 val bytes = android.util.Base64.decode(strSecretKey, android.util.Base64.DEFAULT)
103 val ois = ObjectInputStream(ByteArrayInputStream(bytes))
104 val secretKey = ois.readObject() as SecretKey
105 return secretKey
106}
107
108private fun saveInitializationVector(context: Context, initializationVector: ByteArray) {
109 val baos = ByteArrayOutputStream()
110 val oos = ObjectOutputStream(baos)
111 oos.writeObject(initializationVector)
112 val strToSave = String(android.util.Base64.encode(baos.toByteArray(), android.util.Base64.DEFAULT))
113 val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)
114 val editor = sharedPref.edit()
115 editor.putString("initialization_vector", strToSave)
116 editor.apply()
117}
118
119private fun getSavedInitializationVector(context: Context) : ByteArray {
120 val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)
121 val strInitializationVector = sharedPref.getString("initialization_vector", "")
122 val bytes = android.util.Base64.decode(strInitializationVector, android.util.Base64.DEFAULT)
123 val ois = ObjectInputStream(ByteArrayInputStream(bytes))
124 val initializationVector = ois.readObject() as ByteArray
125 return initializationVector
126}