我使用以下代码在我的应用程序中存储一些加密的信息。
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 中执行相同的操作(
-
使用 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();
-
使用略有不同的"创建"方法创建加密共享首选项:
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)
)