使用EncryptedSharedPreferences的自动备份无法恢复。

问题描述 投票:0回答:1

我使用的是 EncryptedSharedPreferences 将用户信息存储在本地(见 这个 如果你不熟悉)。) 我已经实施了AutoBackUp与BackUp规则。我备份了偏好设置,清除了应用程序上的数据,并尝试恢复数据(按照概述的步骤进行)。备用恢复).

在Android Studio中查看设备文件资源管理器,我可以确认我的首选项文件正在被恢复(它被正确命名,并且其中有加密数据)。然而,我的应用程序的功能就像偏好设置文件不存在一样。

我缺少了什么?

首选项代码。

class PreferenceManager(context: Context) {
    companion object {
        private const val KEY_STORE_ALIAS = "APP_KEY_STORE"
        private const val privatePreferences = "APP_PREFERENCES"
    }

    // See https://developer.android.com/topic/security/data#kotlin for more info
    private val sharedPreferences = EncryptedSharedPreferences.create(
        privatePreferences,
        KEY_STORE_ALIAS,
        context,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
    )

    init {
        //val all = sharedPreferences.all
        //for (item in all) {
            //Log.e("PREFERENCES", "${item.key} - ${item.value}")
        //}
    }

    @SuppressLint("ApplySharedPref")
    fun clear() {
        // Normally you want apply, but we need the changes to be done immediately
        sharedPreferences.edit().clear().commit()
    }

    fun readBoolean(key: String, defaultValue: Boolean): Boolean {
        return sharedPreferences.getBoolean(key, defaultValue)
    }

    fun readDouble(key: String): Double {
        return sharedPreferences.getFloat(key, 0f).toDouble()
    }

    fun readString(key: String): String {
        return sharedPreferences.getString(key, "")!!
    }

    fun removePreference(key: String) {
        sharedPreferences.edit().remove(key).apply()
    }

    fun writeBoolean(key: String, value: Boolean) {
        sharedPreferences.edit().putBoolean(key, value).apply()
    }

    fun writeDouble(key: String, value: Double) {
        sharedPreferences.edit().putFloat(key, value.toFloat()).apply()
    }

    fun writeString(key: String, value: String) {
        sharedPreferences.edit().putString(key, value).apply()
    }
}

我目前没有实现BackupAgent

android kotlin sharedpreferences backup restore
1个回答
1
投票

从我的理解,Jetpack安全依赖于在设备硬件上生成的密钥,所以你不能依靠原始密钥在备份还原后仍然存在(想想改变的设备)。

只有密钥的安全性才是安全的,只要它不能离开Keystore或设备,备份和还原就不能自动工作(没有用户交互)。

我的方法(1)是,你向用户索要密码,根据密码加密你的常规共享首选项(也许可以用另一个加密库:例如 https:/github.comiamMehediSecured-Preference-Store。),然后用Jetpack的 encryptedsharedpreferences保存密码。备份恢复后向用户索要密码,再用Jetpack保存密码,然后解密普通的SharedPreferences.这样即使硬件keystore发生变化,你也可以恢复备份。缺点是,用户需要记住密码。

我在我的应用中遵循这种方法,只是不使用sharedpreferences(它们在我的用例中是不明智的),而是使用应用数据库。

另一种方法(2)是检查加密备份(可从Pie上获得),如果你只关心云中的备份。采用这种方法,你不会在本地加密sharedpreferences,但备份默认是加密的。如果你需要本地加密,这种方法不适合你,但优点是,用户必须在恢复备份时只输入锁屏密码,之后所有的东西都会被恢复,无需进一步的用户交互。9号之前的方法1和9号之后的方法2。

© www.soinside.com 2019 - 2024. All rights reserved.