From 67b491b50dbd1ea2da6181ed6277c383c08914ed Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 11 Jun 2020 22:52:26 +0300 Subject: [PATCH 1/8] Added block writing --- .../roboswag/TouchinSharedPreferences.kt | 53 ++++++++++++++++--- .../TouchinSharedPreferencesCryptoUtils.kt | 6 ++- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt index dae6b07..c6c65e9 100644 --- a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt +++ b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt @@ -2,6 +2,8 @@ package ru.touchin.roboswag import android.content.Context import android.content.SharedPreferences +import ru.touchin.roboswag.TouchinSharedPreferencesCryptoUtils.Companion.ENCRYPTED_BASE64_STRING_LENGTH +import ru.touchin.roboswag.TouchinSharedPreferencesCryptoUtils.Companion.ENCRYPT_BLOCK_SIZE class TouchinSharedPreferences(name: String, context: Context, val isEncryption: Boolean = false) : SharedPreferences { @@ -53,14 +55,30 @@ class TouchinSharedPreferences(name: String, context: Context, val isEncryption: private fun get(key: String?, defaultValue: T): T { if (!currentPreferences.contains(key)) return defaultValue - val value = currentPreferences.getString(key, "")?.decrypt() + val value = currentPreferences.getString(key, "") + var resultValue = "" + value?.let { + var currentValue = "" + var pos = 0 + while (pos < value.length) { + currentValue += value[pos] + pos++ + if (currentValue.length == ENCRYPTED_BASE64_STRING_LENGTH) { + resultValue += currentValue.decrypt() + currentValue = "" + } + } + if (currentValue.isNotEmpty()) { + resultValue += currentValue.decrypt() + } + } return when (defaultValue) { - is Boolean -> value?.toBoolean() as? T - is Long -> value?.toLong() as? T - is String -> value as? T - is Int -> value?.toInt() as? T - is Float -> value?.toFloat() as? T - else -> value as? T + is Boolean -> resultValue.toBoolean() as? T + is Long -> resultValue.toLong() as? T + is String -> resultValue as? T + is Int -> resultValue.toInt() as? T + is Float -> resultValue.toFloat() as? T + else -> resultValue as? T } ?: defaultValue } @@ -94,7 +112,26 @@ class TouchinSharedPreferences(name: String, context: Context, val isEncryption: override fun putString(key: String?, value: String?) = put(key, value) - private fun put(key: String?, value: T) = currentPreferences.edit().putString(key, value.toString().encrypt()) + private fun put(key: String?, value: T): SharedPreferences.Editor { + val value = value?.toString() + var resultValue = "" + value?.let { + var currentValue = "" + var pos = 0 + while (pos < value.length) { + if (currentValue.length == ENCRYPT_BLOCK_SIZE) { + resultValue += currentValue.encrypt() + currentValue = "" + } + currentValue += value[pos] + pos++ + } + if (currentValue.isNotEmpty()) { + resultValue += currentValue.encrypt() + } + } + return currentPreferences.edit().putString(key, resultValue) + } private fun String.encrypt() = if (isEncryption) cryptoUtils.encrypt(this) else this diff --git a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt index 2cc1b82..6913324 100644 --- a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt +++ b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt @@ -23,9 +23,13 @@ class TouchinSharedPreferencesCryptoUtils constructor(val context: Context) { companion object { private const val ANDROID_KEY_STORE = "AndroidKeyStore" - private const val STORAGE_KEY = "STORAGE_KEY" private const val KEY_ALGORITHM_RSA = "RSA" private const val TRANSFORMATION_ASYMMETRIC = "RSA/ECB/PKCS1Padding" + private const val CIPHER_STRING_SIZE_BYTES = 256 + private const val BASE_64_PADDING = 2 + private const val STORAGE_KEY = "STORAGE_KEY" + const val ENCRYPTED_BASE64_STRING_LENGTH = (CIPHER_STRING_SIZE_BYTES + BASE_64_PADDING) * 4 / 3 + 5 + const val ENCRYPT_BLOCK_SIZE = 128 private fun getAndroidKeystore(): KeyStore? = try { KeyStore.getInstance(ANDROID_KEY_STORE).also { it.load(null) } From 8a4533f937a4e617765a52900011b8eb70d0fe9e Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 11 Jun 2020 22:54:34 +0300 Subject: [PATCH 2/8] Fixed names --- .../main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt | 4 ++-- .../touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt index c6c65e9..db36411 100644 --- a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt +++ b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt @@ -2,7 +2,7 @@ package ru.touchin.roboswag import android.content.Context import android.content.SharedPreferences -import ru.touchin.roboswag.TouchinSharedPreferencesCryptoUtils.Companion.ENCRYPTED_BASE64_STRING_LENGTH +import ru.touchin.roboswag.TouchinSharedPreferencesCryptoUtils.Companion.ENCRYPT_BASE64_STRING_LENGTH import ru.touchin.roboswag.TouchinSharedPreferencesCryptoUtils.Companion.ENCRYPT_BLOCK_SIZE class TouchinSharedPreferences(name: String, context: Context, val isEncryption: Boolean = false) : SharedPreferences { @@ -63,7 +63,7 @@ class TouchinSharedPreferences(name: String, context: Context, val isEncryption: while (pos < value.length) { currentValue += value[pos] pos++ - if (currentValue.length == ENCRYPTED_BASE64_STRING_LENGTH) { + if (currentValue.length == ENCRYPT_BASE64_STRING_LENGTH) { resultValue += currentValue.decrypt() currentValue = "" } diff --git a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt index 6913324..86e5abd 100644 --- a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt +++ b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt @@ -28,7 +28,7 @@ class TouchinSharedPreferencesCryptoUtils constructor(val context: Context) { private const val CIPHER_STRING_SIZE_BYTES = 256 private const val BASE_64_PADDING = 2 private const val STORAGE_KEY = "STORAGE_KEY" - const val ENCRYPTED_BASE64_STRING_LENGTH = (CIPHER_STRING_SIZE_BYTES + BASE_64_PADDING) * 4 / 3 + 5 + const val ENCRYPT_BASE64_STRING_LENGTH = (CIPHER_STRING_SIZE_BYTES + BASE_64_PADDING) * 4 / 3 + 5 const val ENCRYPT_BLOCK_SIZE = 128 private fun getAndroidKeystore(): KeyStore? = try { From a50531a294d165fe1f2749d5f0a42772796d1013 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 11 Jun 2020 23:00:10 +0300 Subject: [PATCH 3/8] Updated readme --- README.md | 5 +++-- encrypted-shared-prefs/README.md | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 encrypted-shared-prefs/README.md diff --git a/README.md b/README.md index 3413e51..b9fbe85 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Roboswag позволяет сочетать эти три решения в о ### Работа с RecyclerView RecyclerView - один из самых часто используемых инструментов Android разработчика. Модуль [recyclerview-adapters](/recyclerview-adapters) позволяет сделать работу с RecyclerView более гибкой и делает работу самого элемента быстрее. ### Работа с SharedPreferences -Чтобы сохранять простые данные в память смартфона, используются SharedPreferences. Модуль [storable](/storable) разработан для облегчения работы с SharedPreferences. +Чтобы сохранять простые данные в память смартфона, используются SharedPreferences. Модуль [storable](/storable) разработан для облегчения работы с SharedPreferences. Для шифрования данных в SharedPreferences можно использовать [encrypted-shared-prefs](/encrypted-shared-prefs) ### Утилиты и extension функции В Roboswag также есть много [утилитарных](/utils) классов и [extension](/kotlin-extensions) функций, которые позволяют писать часто используемый код в одну строку. @@ -62,7 +62,8 @@ gradle.ext.roboswag = [ 'tabbar-navigation', 'base-map', 'yandex-map', - 'google-map' + 'google-map', + 'encrypted-shared-prefs' ] gradle.ext.roboswag.forEach { module -> diff --git a/encrypted-shared-prefs/README.md b/encrypted-shared-prefs/README.md new file mode 100644 index 0000000..1b72271 --- /dev/null +++ b/encrypted-shared-prefs/README.md @@ -0,0 +1,14 @@ +Encrypted shared preferences +============================ + +Модуль с реализацией интерфейса `SharedPreferences`, который дает возможность шифровать содержимое. + +### Пример + +Пример создания получения экземпляра `TouchinSharedPreferences`. При isEncryption = false, `TouchinSharedPreferences` абсолютно аналогичны стандартной реализации `SharedPreferences` + +```kotlin +val prefs = TouchinSharedPreferences(name = "APPLICATION_DATA_ENCRYPTED", context = context, isEncryption = true) +``` + +Важно помнить, что в одном файле `TouchinSharedPreferences` могут храниться только либо полностью зашифрованные данные, либо полностью незашифрованные. Флаг `isEncryption` должен быть в соответствующем положении \ No newline at end of file From 51a73cba9db9638e54b4d82ede9b32fd969703a6 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 15 Jun 2020 13:55:26 +0300 Subject: [PATCH 4/8] Fixed review --- encrypted-shared-prefs/README.md | 2 +- .../roboswag/TouchinSharedPreferences.kt | 61 ++++++------------- .../TouchinSharedPreferencesCryptoUtils.kt | 1 + 3 files changed, 19 insertions(+), 45 deletions(-) diff --git a/encrypted-shared-prefs/README.md b/encrypted-shared-prefs/README.md index 1b72271..d6ee538 100644 --- a/encrypted-shared-prefs/README.md +++ b/encrypted-shared-prefs/README.md @@ -5,7 +5,7 @@ Encrypted shared preferences ### Пример -Пример создания получения экземпляра `TouchinSharedPreferences`. При isEncryption = false, `TouchinSharedPreferences` абсолютно аналогичны стандартной реализации `SharedPreferences` +Пример получения экземпляра `TouchinSharedPreferences`. При isEncryption = false, `TouchinSharedPreferences` абсолютно аналогичны стандартной реализации `SharedPreferences` ```kotlin val prefs = TouchinSharedPreferences(name = "APPLICATION_DATA_ENCRYPTED", context = context, isEncryption = true) diff --git a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt index db36411..8cfae10 100644 --- a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt +++ b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt @@ -5,7 +5,7 @@ import android.content.SharedPreferences import ru.touchin.roboswag.TouchinSharedPreferencesCryptoUtils.Companion.ENCRYPT_BASE64_STRING_LENGTH import ru.touchin.roboswag.TouchinSharedPreferencesCryptoUtils.Companion.ENCRYPT_BLOCK_SIZE -class TouchinSharedPreferences(name: String, context: Context, val isEncryption: Boolean = false) : SharedPreferences { +class TouchinSharedPreferences(name: String, context: Context, val encrypt: Boolean = false) : SharedPreferences { private val currentPreferences: SharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE) private val cryptoUtils = TouchinSharedPreferencesCryptoUtils(context) @@ -21,7 +21,7 @@ class TouchinSharedPreferences(name: String, context: Context, val isEncryption: override fun getInt(key: String?, defaultValue: Int) = get(key, defaultValue) override fun getAll(): MutableMap { - return if (isEncryption) { + return if (encrypt) { currentPreferences.all.mapValues { it.value.toString().decrypt() }.toMutableMap() } else { currentPreferences.all.mapValues { it.value.toString() }.toMutableMap() @@ -37,7 +37,7 @@ class TouchinSharedPreferences(name: String, context: Context, val isEncryption: override fun getString(key: String?, defaultValue: String?): String = get(key, defaultValue ?: "") override fun getStringSet(key: String?, set: MutableSet?): MutableSet? { - return if (isEncryption) { + return if (encrypt) { val value = currentPreferences.getStringSet(key, set) if (value == set) { set @@ -55,34 +55,22 @@ class TouchinSharedPreferences(name: String, context: Context, val isEncryption: private fun get(key: String?, defaultValue: T): T { if (!currentPreferences.contains(key)) return defaultValue - val value = currentPreferences.getString(key, "") - var resultValue = "" - value?.let { - var currentValue = "" - var pos = 0 - while (pos < value.length) { - currentValue += value[pos] - pos++ - if (currentValue.length == ENCRYPT_BASE64_STRING_LENGTH) { - resultValue += currentValue.decrypt() - currentValue = "" - } - } - if (currentValue.isNotEmpty()) { - resultValue += currentValue.decrypt() - } - } + val resultValue = currentPreferences.getString(key, "") + ?.trim() + ?.chunked(ENCRYPT_BASE64_STRING_LENGTH) + ?.joinToString(separator = "", transform = { it.decrypt() }) + return when (defaultValue) { - is Boolean -> resultValue.toBoolean() as? T - is Long -> resultValue.toLong() as? T + is Boolean -> resultValue?.toBoolean() as? T + is Long -> resultValue?.toLong() as? T is String -> resultValue as? T - is Int -> resultValue.toInt() as? T - is Float -> resultValue.toFloat() as? T + is Int -> resultValue?.toInt() as? T + is Float -> resultValue?.toFloat() as? T else -> resultValue as? T } ?: defaultValue } - private fun String.decrypt() = if (isEncryption) cryptoUtils.decrypt(this) else this + private fun String.decrypt() = if (encrypt) cryptoUtils.decrypt(this) else this inner class TouchinEditor : SharedPreferences.Editor { @@ -97,7 +85,7 @@ class TouchinSharedPreferences(name: String, context: Context, val isEncryption: override fun putBoolean(key: String?, value: Boolean) = put(key, value) override fun putStringSet(key: String?, value: MutableSet?): SharedPreferences.Editor { - return if (isEncryption) { + return if (encrypt) { currentPreferences.edit().putStringSet(key, value?.map { it.encrypt() }?.toMutableSet()) } else { currentPreferences.edit().putStringSet(key, value) @@ -113,27 +101,12 @@ class TouchinSharedPreferences(name: String, context: Context, val isEncryption: override fun putString(key: String?, value: String?) = put(key, value) private fun put(key: String?, value: T): SharedPreferences.Editor { - val value = value?.toString() - var resultValue = "" - value?.let { - var currentValue = "" - var pos = 0 - while (pos < value.length) { - if (currentValue.length == ENCRYPT_BLOCK_SIZE) { - resultValue += currentValue.encrypt() - currentValue = "" - } - currentValue += value[pos] - pos++ - } - if (currentValue.isNotEmpty()) { - resultValue += currentValue.encrypt() - } - } + val resultValue = value?.toString()?.chunked(ENCRYPT_BLOCK_SIZE)?.joinToString(separator = "", transform = { it.encrypt() }) + return currentPreferences.edit().putString(key, resultValue) } - private fun String.encrypt() = if (isEncryption) cryptoUtils.encrypt(this) else this + private fun String.encrypt() = if (encrypt) cryptoUtils.encrypt(this) else this } diff --git a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt index 86e5abd..f897546 100644 --- a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt +++ b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt @@ -28,6 +28,7 @@ class TouchinSharedPreferencesCryptoUtils constructor(val context: Context) { private const val CIPHER_STRING_SIZE_BYTES = 256 private const val BASE_64_PADDING = 2 private const val STORAGE_KEY = "STORAGE_KEY" + //https://stackoverflow.com/questions/13378815/base64-length-calculation const val ENCRYPT_BASE64_STRING_LENGTH = (CIPHER_STRING_SIZE_BYTES + BASE_64_PADDING) * 4 / 3 + 5 const val ENCRYPT_BLOCK_SIZE = 128 From 494e665df42cb0d0be826a96e22e9fb01d9142d7 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 15 Jun 2020 13:56:51 +0300 Subject: [PATCH 5/8] fixed readme --- encrypted-shared-prefs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/encrypted-shared-prefs/README.md b/encrypted-shared-prefs/README.md index d6ee538..9646cf9 100644 --- a/encrypted-shared-prefs/README.md +++ b/encrypted-shared-prefs/README.md @@ -8,7 +8,7 @@ Encrypted shared preferences Пример получения экземпляра `TouchinSharedPreferences`. При isEncryption = false, `TouchinSharedPreferences` абсолютно аналогичны стандартной реализации `SharedPreferences` ```kotlin -val prefs = TouchinSharedPreferences(name = "APPLICATION_DATA_ENCRYPTED", context = context, isEncryption = true) +val prefs = TouchinSharedPreferences(name = "APPLICATION_DATA_ENCRYPTED", context = context, encrypt = true) ``` Важно помнить, что в одном файле `TouchinSharedPreferences` могут храниться только либо полностью зашифрованные данные, либо полностью незашифрованные. Флаг `isEncryption` должен быть в соответствующем положении \ No newline at end of file From 48017f9803a174fc5f8c40e61b67333a76ca30bb Mon Sep 17 00:00:00 2001 From: Aksenov Vladimir Date: Mon, 15 Jun 2020 14:11:13 +0300 Subject: [PATCH 6/8] Update encrypted-shared-prefs/README.md Co-authored-by: Maxim Bachinsky --- encrypted-shared-prefs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/encrypted-shared-prefs/README.md b/encrypted-shared-prefs/README.md index 9646cf9..481ca7d 100644 --- a/encrypted-shared-prefs/README.md +++ b/encrypted-shared-prefs/README.md @@ -5,10 +5,10 @@ Encrypted shared preferences ### Пример -Пример получения экземпляра `TouchinSharedPreferences`. При isEncryption = false, `TouchinSharedPreferences` абсолютно аналогичны стандартной реализации `SharedPreferences` +Пример получения экземпляра `TouchinSharedPreferences`. При encrypt = false, `TouchinSharedPreferences` абсолютно аналогичны стандартной реализации `SharedPreferences` ```kotlin val prefs = TouchinSharedPreferences(name = "APPLICATION_DATA_ENCRYPTED", context = context, encrypt = true) ``` -Важно помнить, что в одном файле `TouchinSharedPreferences` могут храниться только либо полностью зашифрованные данные, либо полностью незашифрованные. Флаг `isEncryption` должен быть в соответствующем положении \ No newline at end of file +Важно помнить, что в одном файле `TouchinSharedPreferences` могут храниться только либо полностью зашифрованные данные, либо полностью незашифрованные. Флаг `isEncryption` должен быть в соответствующем положении From 0ccaba37c5ccd4694a53444af5d2716e9dbdda47 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 15 Jun 2020 14:52:13 +0300 Subject: [PATCH 7/8] fixed review --- ...inSharedPreferences.kt => CipherSharedPreferences.kt} | 8 ++++---- .../src/main/java/ru/touchin/roboswag/Extensions.kt | 2 +- ...aredPreferencesCryptoUtils.kt => PrefsCryptoUtils.kt} | 9 +++++++-- 3 files changed, 12 insertions(+), 7 deletions(-) rename encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/{TouchinSharedPreferences.kt => CipherSharedPreferences.kt} (91%) rename encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/{TouchinSharedPreferencesCryptoUtils.kt => PrefsCryptoUtils.kt} (92%) diff --git a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/CipherSharedPreferences.kt similarity index 91% rename from encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt rename to encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/CipherSharedPreferences.kt index 8cfae10..65eb56d 100644 --- a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferences.kt +++ b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/CipherSharedPreferences.kt @@ -2,13 +2,13 @@ package ru.touchin.roboswag import android.content.Context import android.content.SharedPreferences -import ru.touchin.roboswag.TouchinSharedPreferencesCryptoUtils.Companion.ENCRYPT_BASE64_STRING_LENGTH -import ru.touchin.roboswag.TouchinSharedPreferencesCryptoUtils.Companion.ENCRYPT_BLOCK_SIZE +import ru.touchin.roboswag.PrefsCryptoUtils.Companion.ENCRYPT_BASE64_STRING_LENGTH +import ru.touchin.roboswag.PrefsCryptoUtils.Companion.ENCRYPT_BLOCK_SIZE -class TouchinSharedPreferences(name: String, context: Context, val encrypt: Boolean = false) : SharedPreferences { +class CipherSharedPreferences(name: String, context: Context, val encrypt: Boolean = false) : SharedPreferences { private val currentPreferences: SharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE) - private val cryptoUtils = TouchinSharedPreferencesCryptoUtils(context) + private val cryptoUtils = PrefsCryptoUtils(context) override fun contains(key: String?) = currentPreferences.contains(key) diff --git a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/Extensions.kt b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/Extensions.kt index 4e4fc87..bcab65b 100644 --- a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/Extensions.kt +++ b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/Extensions.kt @@ -2,7 +2,7 @@ package ru.touchin.roboswag import android.content.SharedPreferences -fun TouchinSharedPreferences.migrateFromSharedPreferences(from: SharedPreferences, key: String): SharedPreferences { +fun CipherSharedPreferences.migrateFromSharedPreferences(from: SharedPreferences, key: String): SharedPreferences { if (!from.contains(key)) return this edit().putString(key, from.getString(key, "") ?: "").apply() from.edit().remove(key).apply() diff --git a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/PrefsCryptoUtils.kt similarity index 92% rename from encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt rename to encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/PrefsCryptoUtils.kt index f897546..671ef19 100644 --- a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/TouchinSharedPreferencesCryptoUtils.kt +++ b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/PrefsCryptoUtils.kt @@ -18,7 +18,7 @@ import javax.security.auth.x500.X500Principal // https://proandroiddev.com/secure-data-in-android-encryption-in-android-part-2-991a89e55a23 @Suppress("detekt.TooGenericExceptionCaught") -class TouchinSharedPreferencesCryptoUtils constructor(val context: Context) { +class PrefsCryptoUtils constructor(val context: Context) { companion object { @@ -28,8 +28,13 @@ class TouchinSharedPreferencesCryptoUtils constructor(val context: Context) { private const val CIPHER_STRING_SIZE_BYTES = 256 private const val BASE_64_PADDING = 2 private const val STORAGE_KEY = "STORAGE_KEY" + //https://stackoverflow.com/questions/13378815/base64-length-calculation - const val ENCRYPT_BASE64_STRING_LENGTH = (CIPHER_STRING_SIZE_BYTES + BASE_64_PADDING) * 4 / 3 + 5 + private const val ORIGINALLY_BYTES_COUNT = 3 + private const val ENCRYPT_BYTES_COUNT = 4 + private const val BASE64_DIVIDER_COUNT = 5 + const val ENCRYPT_BASE64_STRING_LENGTH = + (CIPHER_STRING_SIZE_BYTES + BASE_64_PADDING) * ENCRYPT_BYTES_COUNT / ORIGINALLY_BYTES_COUNT + BASE64_DIVIDER_COUNT const val ENCRYPT_BLOCK_SIZE = 128 private fun getAndroidKeystore(): KeyStore? = try { From 6af592c4f8fc2131224d38810bf36698fa53803d Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 15 Jun 2020 15:02:19 +0300 Subject: [PATCH 8/8] Fixed review --- .../src/main/java/ru/touchin/roboswag/PrefsCryptoUtils.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/PrefsCryptoUtils.kt b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/PrefsCryptoUtils.kt index 671ef19..3a3c888 100644 --- a/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/PrefsCryptoUtils.kt +++ b/encrypted-shared-prefs/src/main/java/ru/touchin/roboswag/PrefsCryptoUtils.kt @@ -30,11 +30,11 @@ class PrefsCryptoUtils constructor(val context: Context) { private const val STORAGE_KEY = "STORAGE_KEY" //https://stackoverflow.com/questions/13378815/base64-length-calculation - private const val ORIGINALLY_BYTES_COUNT = 3 - private const val ENCRYPT_BYTES_COUNT = 4 + private const val DECRYPTED_BYTES_COUNT = 3 + private const val ENCRYPTED_BYTES_COUNT = 4 private const val BASE64_DIVIDER_COUNT = 5 const val ENCRYPT_BASE64_STRING_LENGTH = - (CIPHER_STRING_SIZE_BYTES + BASE_64_PADDING) * ENCRYPT_BYTES_COUNT / ORIGINALLY_BYTES_COUNT + BASE64_DIVIDER_COUNT + (CIPHER_STRING_SIZE_BYTES + BASE_64_PADDING) * ENCRYPTED_BYTES_COUNT / DECRYPTED_BYTES_COUNT + BASE64_DIVIDER_COUNT const val ENCRYPT_BLOCK_SIZE = 128 private fun getAndroidKeystore(): KeyStore? = try {