Skip to content

KryptoPrefs is an open source Kotlin library for handling encrypted SharedPreferences in Android.

License

Notifications You must be signed in to change notification settings

rumboalla/KryptoPrefs

Repository files navigation

KryptoPrefs Android Arsenal

KryptoPrefs is an open source Kotlin library for handling encrypted SharedPreferences in Android.

Features

  • Lightweight library (~70 KB) with no dependencies.
  • High compatibility (API 9 to API 29).
  • Modular: Use the provided algorithms or make your own.
  • Usable from Java and Kotlin.
  • Supports the Android Keystore.
  • KryptoContext for higher level features:
    • Supported types: string, int, long, boolean, date, double, float, short, byte, char, enum and json.
    • Types can be nullable.
    • Types can be memory backed.
    • Types can be observed.
    • Custom types with your custom transform (e.g. JSON). Provided transforms for Gson and Moshi.
    • Asynchronous reads and writes.

Getting started

Add the library to your project:

allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}

dependencies {
    implementation 'com.github.rumboalla.KryptoPrefs:kryptoprefs:0.4.3'
}

Create KryptoPrefs and start using it:

val prefs = KryptoBuilder.pref(context, "MyPrefs", MyPassword, MySalt, ApiTarget)
prefs.putString("Key", "Value")
val v = prefs.getString("Key", "Default")

If you need higher level features, use a KryptoContext:

class Prefs(prefs: KryptoPrefs): KryptoContext(prefs) {
    val stringPref = string("stringPref", "defaultValue")
    val intPref = int("intPref", 42)
    val booleanPref = boolean("booleanPref", false)
}

val prefs = Prefs(KryptoBuilder.hybrid(context, "MyPrefs"))
prefs.stringPref("MyString")            // Write to prefs
val stringPref = prefs.stringPref()     // Read from prefs
prefs.stringPref.put("MyString")        // Alternative write to prefs
val stringPref = prefs.stringPref.get() // Alternative read from prefs

Advanced usage

KryptoPref modes

  • Default: Uses the best possible encryption method available (no Keystore) at the specified API level.
API Encryption Hash Key
9 AesCbcEncryption Sha512Hash PbeKey
10+ AesCbcEncryption Sha512Hash Pbkdf2Key
19+ AesGcmEncryption Sha512Hash Pbkdf2Key
val prefs = KryptoBuilder.pref(context, "MyPrefs", MyPassword, MySalt, ApiTarget)
  • Keystore: Uses the Keystore for everything. More security, less performance.
API Encryption Hash Key
23+ AesGcmEncryption Sha512Hash KeystoreKey
val prefs = KryptoBuilder.keystore(context, "MyPrefs")
  • Hybrid: Uses the Keystore for the key, normal for everything else. Good compromise between security and performance.
API Encryption Hash Key
23+ AesGcmEncryption Sha512Hash HybridKey
val prefs = KryptoBuilder.hybrid(context, "MyPrefs")
  • NoCrypt: Nothing will be encrypted.
API Encryption Hash Key
9+ NoEncryption NoHash NoKey
val prefs = KryptoBuilder.nocrypt(context, "MyPrefs")

Custom KryptoPref

You can create your own KryptoPref:

val prefs = KryptoPrefsImpl(context, "MyPrefs", AesCbcEncryption(), Sha512Hash(), Pbkdf2Key(MyPassword, MySalt))

Asynchronous operations

You can do async reads and writes:

stringPref.putAsync("MyString")
stringPref.getAsync { newValue = it }

Using custom types, collections and JSON

Add kryptoprefs-gson to your project:

implementation 'com.github.rumboalla.KryptoPrefs:kryptoprefs-gson:0.4.3'

Or kryptoprefs-moshi:

implementation 'com.github.rumboalla.KryptoPrefs:kryptoprefs-moshi:0.4.3'

Use json type in your KryptoContext:

class Prefs(prefs: KryptoPrefs): KryptoContext(prefs) {
    val jsonPref = json("jsonPref", TestClass())
    val listPref = json("listPref", emptyList<TestClass>())
}

Nullable types

Types can be nullable:

val nullDatePref = date("nullDatePref", null)

Memory backing

To help performance preferences can be memory backed:

val stringPrefBacked = string("stringPrefBacked", "defaultValue", true)

Observing preferences

You can observe preferences in a KryptoContext by using += or addObserver:

prefs.intPref += { newValue = it }
prefs.intPref.addObserver { newValue = it }

License

Copyright © 2019 rumboalla.
Licensed under the MIT license.