include::../description.adoc[]

include::../ask-yourself.adoc[]

include::../recommended.adoc[]

== Sensitive Code Example

For https://developer.android.com/reference/kotlin/android/database/sqlite/SQLiteDatabase[SQLiteDatabase]:

----
var db = activity.openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null) // Sensitive
----

For https://developer.android.com/training/data-storage/shared-preferences[SharedPreferences]:

----
val pref = activity.getPreferences(Context.MODE_PRIVATE) // Sensitive
----

For https://docs.mongodb.com/realm/[Realm]:

----
val config = RealmConfiguration.Builder().build()
val realm = Realm.getInstance(config) // Sensitive
----

== Compliant Solution

Instead of SQLiteDatabase you can use https://www.zetetic.net/sqlcipher/sqlcipher-for-android/[SQLCipher]:

[source,kotlin]
----
val db = SQLiteDatabase.openOrCreateDatabase("test.db", getKey(), null)
----

Instead of SharedPreferences you can use https://developer.android.com/reference/androidx/security/crypto/EncryptedSharedPreferences[EncryptedSharedPreferences]:

[source,kotlin]
----
val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
EncryptedSharedPreferences.create(
    "secret",
    masterKeyAlias,
    context,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
----

For Realm an encryption key can be specified in the config:

[source,kotlin]
----
val config = RealmConfiguration.Builder()
    .encryptionKey(getKey())
    .build()
val realm = Realm.getInstance(config)
----

include::../see.adoc[]


ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::../message.adoc[]

endif::env-github,rspecator-view[]
