@@ -5,8 +5,10 @@ import android.os.Build
55import android.security.keystore.KeyGenParameterSpec
66import android.security.keystore.KeyProperties
77import android.util.Base64
8+ import android.util.Log
89import androidx.security.crypto.EncryptedSharedPreferences
910import androidx.security.crypto.MasterKey
11+ import java.io.File
1012import java.security.KeyStore
1113import javax.crypto.Cipher
1214import javax.crypto.KeyGenerator
@@ -16,6 +18,13 @@ import javax.crypto.spec.GCMParameterSpec
1618class SecureStorage (context : Context ) {
1719
1820 private val encryptedPrefs = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
21+ createEncryptedPreferences(context)
22+ } else {
23+ // Fallback for older Android versions
24+ context.getSharedPreferences(" secure_prefs" , Context .MODE_PRIVATE )
25+ }
26+
27+ private fun createEncryptedPreferences (context : Context ) = try {
1928 // Use AndroidX Security library for modern encryption
2029 val masterKey = MasterKey .Builder (context)
2130 .setKeyScheme(MasterKey .KeyScheme .AES256_GCM )
@@ -28,9 +37,39 @@ class SecureStorage(context: Context) {
2837 EncryptedSharedPreferences .PrefKeyEncryptionScheme .AES256_SIV ,
2938 EncryptedSharedPreferences .PrefValueEncryptionScheme .AES256_GCM
3039 )
31- } else {
32- // Fallback for older Android versions
33- context.getSharedPreferences(" secure_prefs" , Context .MODE_PRIVATE )
40+ } catch (e: Exception ) {
41+ // Handle corrupted encrypted preferences from previous installations
42+ Log .w(TAG , " Failed to open encrypted preferences, attempting to clear corrupted data" , e)
43+
44+ // Delete the corrupted encrypted preferences file
45+ val prefsFile = File (context.filesDir.parent, " shared_prefs/secure_prefs.xml" )
46+ if (prefsFile.exists()) {
47+ prefsFile.delete()
48+ Log .i(TAG , " Deleted corrupted encrypted preferences file" )
49+ }
50+
51+ // Delete the master key if it exists
52+ try {
53+ val keyStore = KeyStore .getInstance(" AndroidKeyStore" )
54+ keyStore.load(null )
55+ keyStore.deleteEntry(MasterKey .DEFAULT_MASTER_KEY_ALIAS )
56+ Log .i(TAG , " Deleted master key" )
57+ } catch (keyDeleteException: Exception ) {
58+ Log .w(TAG , " Could not delete master key" , keyDeleteException)
59+ }
60+
61+ // Retry creating encrypted preferences with fresh data
62+ val masterKey = MasterKey .Builder (context)
63+ .setKeyScheme(MasterKey .KeyScheme .AES256_GCM )
64+ .build()
65+
66+ EncryptedSharedPreferences .create(
67+ context,
68+ " secure_prefs" ,
69+ masterKey,
70+ EncryptedSharedPreferences .PrefKeyEncryptionScheme .AES256_SIV ,
71+ EncryptedSharedPreferences .PrefValueEncryptionScheme .AES256_GCM
72+ )
3473 }
3574
3675 // Store sensitive data securely
@@ -59,6 +98,8 @@ class SecureStorage(context: Context) {
5998 }
6099
61100 companion object {
101+ private const val TAG = " SecureStorage"
102+
62103 // Keys for sensitive data
63104 const val KEY_USERNAME = " secure_username"
64105 const val KEY_PASSWORD = " secure_password"
0 commit comments