Skip to content

Commit f0b6e77

Browse files
authored
Merge pull request #48 from rootstrap/enhacement/security
Shared pref security
2 parents e8b0d5c + 2d54119 commit f0b6e77

File tree

5 files changed

+75
-29
lines changed

5 files changed

+75
-29
lines changed

.idea/misc.xml

Lines changed: 0 additions & 14 deletions
This file was deleted.

.idea/runConfigurations.xml

Lines changed: 0 additions & 12 deletions
This file was deleted.

app/build.gradle

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ android {
1717
dataBinding.enabled = true
1818
defaultConfig {
1919
applicationId "com.rootstrap.android"
20-
minSdkVersion 21
20+
minSdkVersion 23
2121
targetSdkVersion 29
2222
versionCode 42
2323
versionName "1.0"
@@ -66,18 +66,24 @@ android {
6666
applicationIdSuffix ".dev"
6767
versionNameSuffix "-dev"
6868
buildConfigField("String", "API_URL", "\"https://rails5-api-base.herokuapp.com/api/v1/\"")
69+
buildConfigField("String", "SECURE_KEY_ALIAS", "\"$projectKeyAlias\"")
70+
buildConfigField("String", "SECURE_FILE_NAME", "\"appPreferencesDev\"")
6971
}
7072

7173
staging {
7274
dimension "server"
7375
applicationIdSuffix ".staging"
7476
versionNameSuffix "-staging"
7577
buildConfigField("String", "API_URL", "\"https://proj-staging.herokuapp.com/api/\"")
78+
buildConfigField("String", "SECURE_KEY_ALIAS", "\"$projectKeyAlias\"")
79+
buildConfigField("String", "SECURE_FILE_NAME", "\"appPreferencesStaging\"")
7680
}
7781

7882
prod {
7983
dimension "server"
8084
buildConfigField("String", "API_URL", "\"https://proj-production.herokuapp.com/api/\"")
85+
buildConfigField("String", "SECURE_KEY_ALIAS", "\"$projectKeyAlias\"")
86+
buildConfigField("String", "SECURE_FILE_NAME", "\"appPreferences\"")
8187
}
8288
}
8389

@@ -188,4 +194,7 @@ dependencies {
188194
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'
189195
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.28-alpha'
190196
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.28-alpha'
197+
198+
//security crypto
199+
implementation "androidx.security:security-crypto:1.1.0-alpha03"
191200
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.rootstrap.android.tests.utils
2+
3+
import android.content.SharedPreferences
4+
import androidx.security.crypto.EncryptedSharedPreferences
5+
import com.rootstrap.android.util.Prefs
6+
import dagger.hilt.android.testing.HiltAndroidRule
7+
import dagger.hilt.android.testing.HiltAndroidTest
8+
import org.junit.Assert
9+
import org.junit.Before
10+
import org.junit.Rule
11+
import org.junit.Test
12+
import java.util.* // ktlint-disable no-wildcard-imports
13+
import javax.inject.Inject
14+
15+
@HiltAndroidTest
16+
class PrefTests {
17+
@get:Rule
18+
var hiltRule = HiltAndroidRule(this)
19+
20+
@Inject
21+
lateinit var prefs: Prefs
22+
23+
@Inject
24+
lateinit var preferences: SharedPreferences
25+
26+
@Before
27+
fun init() {
28+
hiltRule.inject()
29+
}
30+
31+
@Test
32+
fun savingSecureDataPrefs() {
33+
val uid = UUID.randomUUID().toString()
34+
prefs.uid = uid
35+
36+
Assert.assertTrue(preferences is EncryptedSharedPreferences)
37+
Assert.assertEquals(prefs.uid, uid)
38+
}
39+
}

app/src/main/java/com/rootstrap/android/util/UtilModule.kt

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ package com.rootstrap.android.util
22

33
import android.content.Context
44
import android.content.SharedPreferences
5-
import androidx.preference.PreferenceManager
5+
import android.security.keystore.KeyGenParameterSpec
6+
import android.security.keystore.KeyProperties
7+
import androidx.security.crypto.EncryptedSharedPreferences
8+
import androidx.security.crypto.MasterKey
9+
import com.rootstrap.android.BuildConfig
610
import com.squareup.otto.Bus
711
import dagger.Module
812
import dagger.Provides
@@ -18,7 +22,27 @@ class UtilModule {
1822
@Provides
1923
@Singleton
2024
fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences {
21-
return PreferenceManager.getDefaultSharedPreferences(context)
25+
26+
val spec = KeyGenParameterSpec.Builder(
27+
BuildConfig.SECURE_KEY_ALIAS,
28+
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
29+
)
30+
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
31+
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
32+
.setKeySize(256)
33+
.build()
34+
35+
val masterKey = MasterKey.Builder(context, BuildConfig.SECURE_KEY_ALIAS)
36+
.setKeyGenParameterSpec(spec)
37+
.build()
38+
39+
return EncryptedSharedPreferences.create(
40+
context,
41+
BuildConfig.SECURE_FILE_NAME,
42+
masterKey,
43+
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
44+
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
45+
)
2246
}
2347

2448
@Provides

0 commit comments

Comments
 (0)