【问题标题】:Unable to access EncryptedSharedPreferences from other activities无法从其他活动访问 EncryptedSharedPreferences
【发布时间】:2020-05-07 08:20:56
【问题描述】:

第一个活动

try {
    masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
    sharedPreferences = EncryptedSharedPreferences.create(
            "secret_shared_prefs",
            masterKeyAlias,
            getApplicationContext(),
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
    );
} catch (GeneralSecurityException | IOException e) {
    e.printStackTrace();
}

SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("memberID", response.body().get(0).getMemberID().toString()).commit();

第二个活动

SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("secret_shared_prefs", MODE_PRIVATE);
sharedPreferences.getString("memberID", "unknown");

在同一个活动中,getSharedPreferences() 按预期工作。当尝试使用此代码访问另一个活动中的首选项时,它始终返回默认值。好像解密有问题。

【问题讨论】:

  • 你能贴出你存储值的代码和你从 sharedPreferences 读取值的代码吗?
  • 据我了解,EncryptedSharedPreferences 的读写方式与普通 SharedPreferences 相同,不同之处在于 ESP 键和值在存储中加密。因此,应该为您处理解密,您应该能够使用sharedPreferences.getString("memberID", "unknown"); 正常获取字符串来源:proandroiddev.com/encrypted-preferences-in-android-af57a89af7c8 如果这不起作用,请更新。
  • 是的,这就是我从文档中了解到的,但它似乎仍然无法使用来自另一个活动的 sharedPreferences.getString() 进行解密。我现在可能只是尝试实施替代方案。

标签: java android sharedpreferences encrypted-shared-preference


【解决方案1】:

为遇到此问题的任何人提供更新。我遇到了同样的问题,并通过与第一个活动相同的方式初始化 sharedPreferences 来修复它。因此(在上面给出的示例中)第二个活动中的行:

SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("secret_shared_prefs", MODE_PRIVATE);

替换为:

try {
masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
sharedPreferences = EncryptedSharedPreferences.create(
        "secret_shared_prefs",
        masterKeyAlias,
        getApplicationContext(),
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);
} catch (GeneralSecurityException | IOException e) {
    e.printStackTrace();
}

现在可以通过常规的 getString(key, deafult) 方法访问:

sharedPreferences.getString("memberID","unknown");

对于像我这样的新手,我还建议检查保存首选项的 .xml 文件以检查它们是否实际加密(可以在 data/data/"application_name"/shared_prefs/"preference_name".xml 中找到) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2018-03-14
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多