在安卓开发中,使用SQLite数据库存储敏感数据(如用户信息、密码、支付信息等)时,默认情况下数据库文件是未加密的,攻击者通过获取设备Root权限或物理接触设备,可直接读取数据库文件内容,数据库加密是保护数据隐私的重要手段。
SQLCipher是基于SQLite的扩展库,支持透明数据加密(TDE),无需修改原有SQL语句即可实现加密。
implementation 'net.zetetic:android-database-sqlcipher:4.5.0'
// 加载SQLCipher库 SQLiteDatabase.loadLibs(context); // 创建加密数据库(需提供密钥) SQLiteOpenHelper helper = new DatabaseHelper(context, "encrypted.db", null, 1);
String key = "my_secret_key"; // 实际应从安全来源获取 SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("encrypted.db", key, null);
直接对数据库文件进行AES加密,适合需要完全控制加密逻辑的场景。
// 使用AES加密数据库文件 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES"); cipher.init(Cipher.ENCRYPT_MODE, keySpec); // 读取原数据库文件 -> 加密后写入新文件
方式 | 安全性 | 适用场景 | 备注 |
---|---|---|---|
硬编码密钥 | 低 | 快速原型开发 | 极易被反编译,禁止用于生产环境 |
Android Keystore | 高 | 生产环境 | 系统级密钥存储,需用户解锁设备 |
远程服务器生成密钥 | 中 | 多设备同步数据 | 需网络请求,存在通信安全风险 |
用户输入密码生成密钥 | 中 | 用户自主控制 | 需平衡用户体验与安全性 |
推荐方案:使用Android Keystore系统生成密钥,并通过用户指纹或面部识别验证密钥使用权。
指标 | SQLCipher | 自定义AES |
---|---|---|
加密开销 | 低(透明加解密) | 高(全文件加解密) |
开发复杂度 | 低(无需修改SQL) | 高(需手动处理) |
适用场景 | 大多数业务需求 | 特殊安全要求场景 |
解答:
sqlcipher
对原数据库文件加密: sqlcipher old.db new.db -k your_key
new.db
作为加密数据库。解答: