【问题标题】:How to implement encrypted sharepreferences如何实现加密的共享首选项
【发布时间】:2020-09-20 11:01:05
【问题描述】:

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

【问题讨论】:

    标签: java android encryption sharedpreferences encrypted-shared-preference


    【解决方案1】:

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

    所以我找到了this answer,它成功了。这是片段中的代码。如果您想在 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");
        }
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        • 2014-08-17
        • 2012-09-08
        • 1970-01-01
        • 2020-08-01
        相关资源
        最近更新 更多