Security Crypto:加密偏好与文件 · AndroidX 源码指南
AAndroidX 源码指南
安全
安全 · androidx.security

Security Crypto:加密偏好与文件1.1.0-rc01

EncryptedSharedPreferences 与 EncryptedFile 的初始化、写入与读取。

最后更新 2026-08-01

复制即用

加密 SharedPreferences:

import android.content.Context
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey

val masterKey = MasterKey.Builder(context)
    .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
    .build()

val prefs = EncryptedSharedPreferences.create(
    context,
    "secret_prefs",
    masterKey,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM,
)

prefs.edit().putString("token", "abc").apply()
val token = prefs.getString("token", null)

加密文件:

import androidx.security.crypto.EncryptedFile
import androidx.security.crypto.MasterKey

val encryptedFile = EncryptedFile.Builder(
    context,
    File(context.filesDir, "secret.txt"),
    masterKey,
    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB,
).build()

// 写入
encryptedFile.openFileOutput().use { output ->
    output.write("机密内容".toByteArray())
}

// 读取
encryptedFile.openFileInput().use { input ->
    val content = input.readBytes().toString(Charsets.UTF_8)
}

加密方案选择

容器加密方案用途
EncryptedSharedPreferenceskey: AES256_SIV,value: AES256_GCM小体积键值对(token、设置)
EncryptedFileAES256_GCM_HKDF_4KB任意大小的文件

Keystore 一致性校验

MasterKey.Builder 支持 KeyUniquenessScheme,避免同一 Keystore 条目被复用:

val masterKey = MasterKey.Builder(context)
    .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
    .setKeyUniquenessScheme(MasterKey.KeyUniquenessScheme.SECURE)
    .build()

常见陷阱

  • 模拟器/无 Keystore 设备MasterKey 构建失败抛异常,需 try-catch 并降级(如提示用户)。
  • 清除应用数据 = 丢数据:MasterKey 在 Keystore,但加密数据在 filesDir/SharedPreferences 里,清数据两样都没了。
  • 主线程卡顿:首次使用触发 Keystore 初始化,放后台线程(withContext(Dispatchers.IO))。
  • 不要把密钥写进源码:用 Keystore 管理,别硬编码 AES key。
  • 升级主密钥:更换 setKeyScheme 会导致旧数据无法解密,需要迁移。

与明文存储对比

场景明文 SharedPreferencesEncryptedSharedPreferences
读取速度慢(解密开销)
root 后安全性直接可见Keystore 保护
适用非敏感 UI 状态token、密钥、个人信息

要点

  • MasterKey 由 Android Keystore 保护,不落盘明文。
  • 必须先成功构建 MasterKey 再创建加密容器;设备不支持时(如模拟器缺 Keystore)会抛异常。
  • EncryptedSharedPreferences 的 key 和 value 可分别选加密方案。
  • 首次使用时可能触发 Keystore 初始化,建议放后台线程。

相关页面