如何在 Android 中弃用万能密钥后创建万能钥匙



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

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
)

由于万能钥匙类在Android中已弃用,我应该使用万能钥匙类,但我无法弄清楚什么是定义相同掌握的正确方法。

有人可以显示与可用的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);

试试这个


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);

我今天遇到了完全相同的问题。有关修复/解决方法,请参见下文(示例在 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();
    
  2. 使用略有不同的"创建"方法创建加密共享首选项:

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

这应该可以解决问题:)

参考和更多详细信息: https://devmainapps.blogspot.com/2020/06/android-masterkeys-deprecated-how-to.html

我的版本获取秘密共享首选项:

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
)
}

你可以使用其中任何一种方式

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();

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

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

你可以在下面这样使用它

//Creating MasterKey
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val fileToRead = "your_file_name.txt"
val encryptedFile = EncryptedFile.Builder(context,
File(context.filesDir, fileToRead),
masterKey,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()

Kotlin 版本基于此处的响应,依赖于 Security Kotlin 版本androidx.security:security-crypto-ktx

class EncryptedPrefsImpl(context: Context) { 
private companion object {    
const val PREFERENCES_NAME = "some_file_name_here"
}
private val spec = KeyGenParameterSpec.Builder(
MasterKey.DEFAULT_MASTER_KEY_ALIAS,
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
).apply {
setBlockModes(KeyProperties.BLOCK_MODE_GCM)
setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
setKeySize(MasterKey.DEFAULT_AES_GCM_MASTER_KEY_SIZE)
}.build()
private val masterKey = MasterKey.Builder(context).apply {
setKeyGenParameterSpec(spec)
}.build()
val preferences: SharedPreferences by lazy {
EncryptedSharedPreferences(
context,
PREFERENCES_NAME,
masterKey
)
}
}

如果您使用的是androidx.security:security-crypto-ktx版本,则可以将一些样板文件减少到如下所示:

val encryptedSharedPrefs = EncryptedSharedPreferences(
context,
ENCRYPTED_STORAGE_FILENAME,
MasterKey(context)
)

相关内容

  • 没有找到相关文章

最新更新