1

如何使用https://developer.android.google.cn/reference/androidx/security/crypto/EncryptedSharedPreferences在我的 android java 应用程序中实现加密共享首选项?我不知道如何实现它,有人可以帮忙吗?

4

2 回答 2

3

我正在使用与@Chirag 编写的代码类似的代码,但是在我对我的 Android Studio 4.0 项目应用新的更新后,我收到了一个警告说MasterKeys类已被弃用。

所以我找到了这个答案,它成功了。这是片段中的代码。如果您想在 MainActivity 中使用它,请更改getContext()this

 MasterKey getMasterKey() {
    try {
        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
                "_androidx_security_master_key_",
                KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                .setKeySize(256)
                .build();

        return new MasterKey.Builder(getContext())
                .setKeyGenParameterSpec(spec)
                .build();
    } catch (Exception e) {
        Log.e(getClass().getSimpleName(), "Error on getting master key", e);
    }
    return null;
}

private SharedPreferences getEncryptedSharedPreferences() {
    try {
        return EncryptedSharedPreferences.create(
                Objects.requireNonNull(getContext()),
                "Your preference file name",
                getMasterKey(), // calling the method above for creating MasterKey
                EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
                EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
        );
    } catch (Exception e) {
        Log.e(getClass().getSimpleName(), "Error on getting encrypted shared preferences", e);
    }
    return null;
}

然后你可以像这样使用上面的:

   public void someFunction(){
        SharedPreferences sharedPreferences = getEncryptedSharedPreferences();
        //Used to add new entries and save changes
        SharedPreferences.Editor editor = sharedPreferences.edit();
        
        //To add entry to your shared preferences file
        editor.putString("Name", "Value");
        editor.putBoolean("Name", false);
        //Apply changes and commit
        editor.apply();
        editor.commit();
        
        //To clear all keys from your shared preferences file
        editor.clear().apply();
        
        //To get a value from your shared preferences file
        String returnedValue  = sharedPreferences.getString("Name", "Default value if null is returned or the key doesn't exist");
    }
于 2020-07-20T22:07:29.930 回答
2

根据文档示例,您可以EncryptedSharedPreferences像这样初始化。

public SharedPreferences getEncryptedSharedPreferences(){
   String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
   SharedPreferences sharedPreferences = EncryptedSharedPreferences.create(
       "secret_shared_prefs_file",
       masterKeyAlias,
       context,
       EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
       EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
   );
    return sharedPreferences;
}

保存数据

getEncryptedSharedPreferences().edit()
        .putString("key", value) 
        .apply()

获取数据

getEncryptedSharedPreferences().getString("key", "defaultValue");

确保您的应用 API 版本为 23+,并且您需要添加此依赖项

implementation "androidx.security:security-crypto:1.0.0-alpha02" //Use latest version
于 2020-06-02T03:29:26.330 回答