将普通共享首选项转换为加密共享首选项



我的应用当前正在使用

sp = PreferenceManager.getDefaultSharedPreferences(ctx);

以获取共享首选项对象。 由于一些安全要求,现在我需要升级它以使用android喷气背包库中提供的EncryptedSharedPpreferences。

这里发生的事情是,当我使用加密共享首选项对象时,我丢失了存储在普通共享首选项文件中的所有数据。
如何在加密共享首选项上获取所有数据。

答案:

我的迁移如下所示:

fun migrate() {
val oldPreferences = PreferenceManager.getDefaultSharedPreferences(context)
val newPreferences =  EncryptedSharedPreferences.create(...)
with(newPreferences.edit()) {
oldPreferences.all.forEach { (key, value) ->
when (value) {
is Boolean -> putBoolean(key, value)
is Float -> putFloat(key, value)
is String -> putString(key, value)
is Int -> putInt(key, value)
is Long -> putLong(key, value)
is Set<*> -> putStringSet(key, value.map { it.toString() }.toSet())
else -> throw IllegalStateException("unsupported type for shared preferences migration")
}
}
apply()
}
oldPreferences.edit().clear().apply()
}

可以在不创建新的共享首选项文件的情况下执行此操作,但是您为什么要...

解释:

任何共享首选项都存储在.xml文件中。您可以找到该文件并读取它,因此不难看出它发生了什么。

我尝试将EncryptedSharedPreferences与现有文件一起使用,旧值仍未加密。EncryptedSharedPreferences现在无法访问旧值。

EncryptedSharedPreferences没有加密文件。它们分别加密密钥和值,因此您的首选项.xml文件可能如下所示:

<map>
<string name="__androidx_security_crypto_encrypted_prefs_key_keyset__">12a9018b0938...</string>
<string name="AWNywuPwU...">ARu2fgn5N7wV...</string>
<string name="__androidx_security_crypto_encrypted_prefs_value_keyset__">1288018cc6...</string>
</map>

这意味着您无法运行某些单行代码来加密现有文件。所以我相信唯一的方法是按照答案所示进行自己的迁移。

希望对你有帮助

最新更新