当前位置:首页 > 行业动态 > 正文

安卓开发中如何对数据加密

安卓数据加密常用AES对称加密,结合Keystore密钥管理,通过Cipher类实现本地/网络数据加解密

加密基础概念

  1. 对称加密
    使用同一密钥进行加解密,适合大量数据加密(如AES算法)。
    特点:速度快,但密钥传输需安全。

  2. 非对称加密
    使用公钥加密、私钥解密,适合密钥交换或数字签名(如RSA算法)。
    特点:安全性高,但计算速度慢。

    安卓开发中如何对数据加密  第1张

  3. 哈希算法
    将任意长度数据转换为固定长度摘要(如SHA-256),不可逆,用于数据完整性校验。


Android平台加密工具与API

工具/API 用途
javax.crypto.Cipher 实现AES、RSA等加密算法
AndroidKeyStore 安全存储密钥(支持生物识别绑定)
Jetpack Security 提供EncryptedSharedPreferencesEncryptedFile工具类
SQLCipher 加密SQLite数据库(需集成第三方库)

数据存储加密方案

SharedPreferences加密

// 使用Jetpack Security的EncryptedSharedPreferences
val sharedPreferences = EncryptedSharedPreferences.create(
    context,
    "secret_prefs",
    masterKey, // 通过AndroidKeyStore生成的MasterKey
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    true // 兼容旧设备
)
sharedPreferences.edit().putString("key", "value").apply()

SQLite数据库加密

  • 方案1:使用SQLCipher
    替换原生SQLite,直接对数据库文件加密。
  • 方案2:应用层加密
    在存入数据库前手动加密数据字段(推荐结合AndroidKeyStore管理密钥)。

文件加密

// 使用Jetpack Security的EncryptedFile
val encryptedFile = EncryptedFile.Builder(
    fileName,
    context,
    masterKey,
    EncryptedFile.FileEncryptionScheme.AES256_GCM_SIV
).build()
encryptedFile.openFileOutput().write("Sensitive Data".toByteArray())

网络传输加密

  1. 强制使用HTTPS
    Network Security Config中配置:

    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">example.com</domain>
    </domain-config>
  2. 证书验证
    • 自签名证书需手动添加到本地信任库
    • 使用OkHttp时配置CertificatePinner防止中间人攻击。

密钥管理最佳实践

  1. 使用AndroidKeyStore
    val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC
    val keyStore = KeyStore.getInstance("AndroidKeyStore")
    keyStore.load(null)
    val key = keyStore.getKey(keyAlias, null) ?: throw Exception("Key not found")
  2. 避免硬编码密钥
    密钥应存储在Keystore或远程服务器,禁止直接写在代码中。

常见错误与解决方案

问题 解决方案
密钥泄露(如存储在代码中) 使用AndroidKeyStore并绑定用户认证(指纹/面容)
加密数据被逆向破解 结合代码混淆(ProGuard)和动态密钥(每次启动生成新密钥)
性能瓶颈(如大文件加密) 分块加密或使用硬件加速(如Android 9+的CipherOutputStream优化)

相关问题与解答

Q1:如何验证数据是否被改动?

A:使用哈希算法(如SHA-256)生成数据摘要,并将摘要与原始数据一起存储,加解密时重新计算摘要并与存储值比对,若不一致则数据被改动。

val digest = MessageDigest.getInstance("SHA-256")
val hash = digest.digest(data.toByteArray())

Q2:加密后的数据如何存储到云端?

A

  1. 客户端用本地密钥加密数据
  2. 将加密后的数据上传至云端
  3. 密钥通过非对称加密(如RSA)传输给服务器,或存储在安全的密钥管理服务(如AWS KMS)
0