Android数据库加解密逆向分析
一、Android 数据库现状
二、常见数据库加密方案(逆向必懂)
1)SQLCipher(最主流,90% App 用这个)
底层在 SQLite 的 Pager 层做 AES-256-CBC 全库加密
数据库文件落盘全密文,打开必须传密码
密钥通常:硬编码、动态生成、设备信息派生(IMEI/Android ID)
特征:
so 库:libsqlcipher.so
类名:net.sqlcipher.database.*
打开数据库时传入 password
2)自定义全库加密
自己封装 SQLite,读写时加解密
常见:AES、XOR、RC4、3DES
特征:无 SQLCipher 类,有大量加密工具类
3)字段级加密(只加密敏感字段)
数据库明文,手机号 / 身份证 / 密码等字段 AES 加密后存
特征:建表语句正常,字段内容是密文(base64/hex)
三、逆向分析核心目标
加密算法(AES/XOR/RC4/...)
密钥(key、iv、salt、迭代次数)
加解密入口函数
四、逆向分析完整步骤(实操流程)
步骤 1:拿到加密数据库文件
adb root adb pull /data/data/包名/databases/xxx.db
步骤 2:反编译 APK,定位加密代码
工具
JADX(看 Java 代码)
JEB/IDA(看 so 层)
Frida(动态调试)
搜索关键词(必搜)
SQLCipher → net.sqlcipher.database
SQLiteDatabase、openDatabase
加密关键词:AES、Cipher、encrypt、decrypt、key、iv、salt
数据库密码相关:"password"、"secret"、"dbkey"
步骤 3:静态分析(Java 层)
典型 SQLCipher 代码
SQLiteDatabase db=SQLiteDatabase.openDatabase( "/data/data/xxx/xxx.db", "123456", // 密钥(重点找这个) null, SQLiteDatabase.OPEN_READWRITE);
密钥常见来源
硬编码字符串(最容易)
从 assets/SharedPreferences 读取
设备信息:IMEI、Android ID、MAC、包名
PBKDF2 派生(微信等):密码 + salt + 迭代次数 → 真正密钥
步骤 4:静态分析(so 层,SQLCipher / 自定义加密)
查看 libsqlcipher.so/ 自定义 libdb.so
IDA 搜索:
sqlite3_open、sqlite3_exec
AES、CBC、encrypt、decrypt
密钥常量(16/24/32 字节)
步骤 5:动态调试(Frida 最有效)
// hook SQLCipher 密码Java.perform(function() {
var db=Java.use("net.sqlcipher.database.SQLiteDatabase");
db.openDatabase.implementation=function(path, password, a, b) {
console.log("DB Path: " + path);
console.log("Password: " + password); // 直接拿到密钥
return this.openDatabase(path, password, a, b);
}});frida -U -n 包名 -l hook.js
五、拿到密钥后如何解密(实战)
1)SQLCipher 数据库解密
sqlcipher encrypted.db sqlite> PRAGMA key='密钥';sqlite> .output plain.db sqlite> .dump sqlite> .exit
2)自定义加密数据库
逆向拿到加密函数(AES/XOR)
写 Python 脚本批量解密页面 / 字段
六、常见坑(逆向必知)
密钥在 so 里:Java 层无密钥,必须 IDA 调试
动态密钥:每次启动随机生成,需 hook 生成函数
密钥加固:dex/so 加壳,需先脱壳
数据库防篡改:HMAC 校验,改密文会校验失败






