上一篇
安卓开发中如何对数据加密
- 行业动态
- 2025-04-23
- 4095
安卓数据加密常用AES对称加密,结合Keystore密钥管理,通过Cipher类实现本地/网络数据加解密
加密基础概念
对称加密
使用同一密钥进行加解密,适合大量数据加密(如AES算法)。
特点:速度快,但密钥传输需安全。非对称加密
使用公钥加密、私钥解密,适合密钥交换或数字签名(如RSA算法)。
特点:安全性高,但计算速度慢。哈希算法
将任意长度数据转换为固定长度摘要(如SHA-256),不可逆,用于数据完整性校验。
Android平台加密工具与API
工具/API | 用途 |
---|---|
javax.crypto.Cipher | 实现AES、RSA等加密算法 |
AndroidKeyStore | 安全存储密钥(支持生物识别绑定) |
Jetpack Security | 提供EncryptedSharedPreferences 和EncryptedFile 工具类 |
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())
网络传输加密
- 强制使用HTTPS
在Network Security Config
中配置:<domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">example.com</domain> </domain-config>
- 证书验证
- 自签名证书需手动添加到本地信任库
- 使用
OkHttp
时配置CertificatePinner
防止中间人攻击。
密钥管理最佳实践
- 使用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")
- 避免硬编码密钥
密钥应存储在Keystore或远程服务器,禁止直接写在代码中。
常见错误与解决方案
问题 | 解决方案 |
---|---|
密钥泄露(如存储在代码中) | 使用AndroidKeyStore并绑定用户认证(指纹/面容) |
加密数据被逆向破解 | 结合代码混淆(ProGuard)和动态密钥(每次启动生成新密钥) |
性能瓶颈(如大文件加密) | 分块加密或使用硬件加速(如Android 9+的CipherOutputStream 优化) |
相关问题与解答
Q1:如何验证数据是否被改动?
A:使用哈希算法(如SHA-256)生成数据摘要,并将摘要与原始数据一起存储,加解密时重新计算摘要并与存储值比对,若不一致则数据被改动。
val digest = MessageDigest.getInstance("SHA-256") val hash = digest.digest(data.toByteArray())
Q2:加密后的数据如何存储到云端?
A:
- 客户端用本地密钥加密数据
- 将加密后的数据上传至云端
- 密钥通过非对称加密(如RSA)传输给服务器,或存储在安全的密钥管理服务(如AWS KMS)