在 Android 中弃用 MasterKeys 后如何创建 masterKey

End*_*lah 16 kotlin encrypted-shared-preference

我正在使用以下代码在我的应用程序中存储一些加密的信息。

    val masterKey = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)

    val sharedPreferences = EncryptedSharedPreferences.create(
        "secret_shared_prefs",
        masterKey,
        this,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
    )
Run Code Online (Sandbox Code Playgroud)

由于 MasterKeys 类在 Android 中已弃用,我应该使用 MasterKey 类,但我无法弄清楚获得相同定义的正确方法是什么。

有人可以显示与可用的 MasterKey 和 MasterKey.Builder 类的完全匹配吗?

下面的解决方案是这样工作的:

val spec = KeyGenParameterSpec.Builder(
        "_androidx_security_master_key_",
        KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
    )
        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
        .setKeySize(256)
        .build()

    val masterKey: MasterKey = MasterKey.Builder(this)
        .setKeyGenParameterSpec(spec)
        .build()

    val sharedPreferences = EncryptedSharedPreferences.create(
        this,
        "secret_shared_prefs",
        masterKey, // masterKey created above
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);
Run Code Online (Sandbox Code Playgroud)

小智 33

试试这个


MasterKey masterKey = new MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)
        .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
        .build();

SharedPreferences sharedPreferences = EncryptedSharedPreferences.create(
        context,
        SHARED_PREF_NAME,
        masterKey,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);
Run Code Online (Sandbox Code Playgroud)

  • 为什么我在日志中看到“找不到密钥集,将生成新密钥集”的警告? (2认同)

小智 29

我今天遇到了完全相同的问题。请参阅下面的修复/解决方法(示例在 Java 代码中,但您可以在 Kotlin 中轻松执行相同操作)

  1. 使用 MasterKey.Builder 创建 MasterKey(而不是 MasterKeys)。使用“手动”创建的 KeyGenParameterSpec 构建它:

     // this is equivalent to using deprecated MasterKeys.AES256_GCM_SPEC
     KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
             MASTER_KEY_ALIAS,
             KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
             .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
             .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
             .setKeySize(KEY_SIZE)
             .build();
    
     MasterKey masterKey = new MasterKey.Builder(MainActivity.this)
             .setKeyGenParameterSpec(spec)
             .build();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用稍微不同版本的“create”方法创建 EncryptedSharedPreferences:

     EncryptedSharedPreferences.create(
             MainActivity.this,
             "your-app-preferences-name",
             masterKey, // masterKey created above
             EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
             EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);
    
    Run Code Online (Sandbox Code Playgroud)

这应该够了吧 :)

参考及更多详情:https : //devmainapps.blogspot.com/2020/06/android-masterkeys-deprecated-how-to.html

  • 这需要至少 API 23 (4认同)
  • @xproph 对于“MASTER_KEY_ALIAS”和“KEY_SIZE”,我们可以使用“DEFAULT_MASTER_KEY_ALIAS”和“DEFAULT_AES_GCM_MASTER_KEY_SIZE” (2认同)

Cmo*_*ien 15

我的版本获取秘密共享偏好:

private fun getSecretSharedPref(context: Context): SharedPreferences {
    val masterKey = MasterKey.Builder(context)
            .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
            .build()

    return EncryptedSharedPreferences.create(context,
            "secret_shared_prefs",
            masterKey,
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
    )
}
Run Code Online (Sandbox Code Playgroud)


小智 7

你可以使用任何一种方式

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

MasterKey masterKey = new MasterKey.Builder(MainActivity.this)
     .setKeyGenParameterSpec(spec)
     .build();
Run Code Online (Sandbox Code Playgroud)

或者

MasterKey masterKey = new 
              MasterKey.Builder(context,MasterKey.DEFAULT_MASTER_KEY_ALIAS).
              setKeyScheme(MasterKey.KeyScheme.AES256_GCM).build();
Run Code Online (Sandbox Code Playgroud)

MasterKey.KeyScheme.AES256_GCM 在内部使用与上述相同的密钥生成规范。