【问题标题】:What key alias need to use in EncryptedSharedPreferences?在 EncryptedSharedPreferences 中需要使用什么密钥别名?
【发布时间】:2021-06-19 22:34:41
【问题描述】:

如何在加密共享首选项中使用密钥别名? 以下是我的加密共享偏好

KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
                    DEFAULT_MASTER_KEY_ALIAS,
                    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                    .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                    .setKeySize(DEFAULT_AES_GCM_MASTER_KEY_SIZE)
                    .build();

            MasterKey masterKey = new MasterKey.Builder(this)
                    .setKeyGenParameterSpec(spec)
                    .build();

            SharedPreferences sharedPreferences = EncryptedSharedPreferences.create(this,
                    this.getResources().getString(R.string.app_preferences),
                    masterKey,
                    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
                    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
            );

执行此操作时出现以下异常,

 W/AndroidKeysetManager: keyset not found, will generate a new one
    java.io.FileNotFoundException: can't read keyset; the pref value __androidx_security_crypto_encrypted_prefs_key_keyset__ does not exist
        at com.google.crypto.tink.integration.android.SharedPrefKeysetReader.readPref(SharedPrefKeysetReader.java:71)
        at com.google.crypto.tink.integration.android.SharedPrefKeysetReader.readEncrypted(SharedPrefKeysetReader.java:89)
        at com.google.crypto.tink.KeysetHandle.read(KeysetHandle.java:105)
        at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.read(AndroidKeysetManager.java:311)
        at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.readOrGenerateNewKeyset(AndroidKeysetManager.java:287)
        at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.build(AndroidKeysetManager.java:238)
        at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:155)
        at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:120)

我需要将DEFAULT_MASTER_KEY_ALIAS 替换为该框中提到的密钥别名吗? 如果是,那我怎么能在没有硬编码的情况下做到这一点?

我已将 DEFAULT_MASTER_KEY_ALIAS 替换为模块下项目结构中提到的密钥别名。出现以下异常。

java.lang.IllegalArgumentException: KeyGenParamSpec's key alias does not match provided alias (_androidx_security_master_key_ vs mykeyalias

【问题讨论】:

  • 签名密钥是存在于您的计算机(或可能是外部驱动器)上的密钥,用于对您的应用进行签名。您应该保持该密钥的安全,因此尝试将其捆绑在您的应用程序中似乎是个坏主意。我不清楚你为什么不像文档中的示例那样简单地使用MasterKeys.getOrCreate
  • 你能解决这个问题吗?使用来自developer.android.com/topic/security/data-android-versions的示例代码时,我得到了相同的FileNotFoundException
  • 您找到解决方案了吗?如果是,请您发布解决方案吗?

标签: java android encryption encrypted-shared-preference


【解决方案1】:

在这种情况下,您不一定需要使用 keyalias。但是我不能使用 KeyGenParameterSpec 所以我使用了 KeyScheme 它对我有用。尝试使用它:

MasterKey masterKey = new MasterKey.Builder(this)
              .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
              .build();

代替:

MasterKey masterKey = new MasterKey.Builder(this)
                .setKeyGenParameterSpec(spec)
                .build();

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2019-08-17
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2021-08-12
  • 2015-07-24
相关资源
最近更新 更多