0

第一个活动

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

4

1 回答 1

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 中找到)。

于 2021-09-30T12:58:21.687 回答