GreenDao Encrypt

GreenDao Encryption 翻译

数据库加密
greenDao支持加密的数据库来保护敏感资料。虽然新版本的Android支持文件系统加密,但是它自身不能提供额外的对数据库文件的安全支持。一旦攻击者持有了数据库文件(在一个root设备上或者通过一些安全漏洞),他就能使用所有内部文件。使用一个加密的数据库会多一层安全保护。密码能阻止攻击者容易的打开数据库文件。

传统的SQLite和SQLCipher

因为Android不支持原生数据库加密,你需要将一个自定义构建的SQLite放进你的APK文件中。那些自定义构建由CPU依赖,原生代码构成。当然,你的APK大小会增长几M。因此,你应该只使用加密如果你真的需要。
greenDao支持SQL密码通过直接的绑定。SQLCipher是一个使用256位AES加密来自定义构建的SQLite。了解到的是SQLCipher能正常工作在Android N预览兼容版中。

建立数据库加密

第一步:调整依赖

添加下面两条依赖到你的Gradle文件中。

compile 'org.greenrobot:greendao-encryption:2.2.2'
compile 'net.zetetic:android-database-sqlcipher:3.5.1'

注意将greendao-encryption替换掉greendao(移除greendao依赖如果之前你的工程中使用了greenDao)。当然,你可以检查最新的版本。
同样的,你还需要使用另一个成品在你的工程中:

compile 'org.greenrobot:greendao-generator-encryption:2.2.0'

第二步:数据库初始化

不能使用Android的SQLiteOpenHelper,因为它会返回一个未加密的数据库。相反,greenDao的EncryptedDatabaseOpenHelper返回一个加密了的数据库并且取代标准的SQLiteOpenHelper。这个过程基本相同,只有两个不同:
(1)onCreate和onUpgrade给你一个接口de.greenrobot.dao.database.Database取代了android.database.sqlite.SQLiteDatabase。这个数据库接口有一个方法execSQL,就像SQLiteDatabase,用来创建或者升级你的数据库。

(2)getWritableDatabase和getReadableDatabase需要密码。通过这个密码,会生成一个加密的key.显然,一旦数据库用一些key来创建,后续的使用都需要同一个key才能打开数据库。

为了便利,greenDao创建了4个EncryptedDatabaseOpenHelper放进DaoMaster类中。其中标准的OpenHelper和DevOpenHelper对未加密的数据库起作用,你也能使用 EncryptedOpenHelper和EncryptedDevOpenHelper。这后两个是EncryptedDatabaseOpenHelper的子类并且它们两个返回一个加密的数据库。

数据库初始化示例代码:

Database db = new EncryptedOpenHelper(context, "mydatabase") {
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
// Use db.execSQL(...) to execute SQL for schema updates
}
}.getReadableDatabase("secret-password");
DaoSession daoSession = new DaoMaster(db).newSession();

数据库抽象

不像标准greenDao的编译过程,加密版greenDao的编译过程使用了一个轻薄的抽象层来对所有的数据库起作用。这个抽象层支持标准和不标准的SQLite:
1.Android标准的:android.database.sqlite.SQLiteDatabase
2.SQLCipher:net.sqlcipher.database.SQLiteDatabase
3.任何继承de.greenrobot.dao.database.Database的兼容版本
抽象数据库允许标准数据库和加密数据库使用同一套代码。这能使你很容易的在简单的数据库和加密的数据库之间转换,因为我们的代码是一样的当我们以DaoSession和独立的DAO为目标时。

用Robolectric单元测试

知晓SQLCipher不兼容

你可能感兴趣的:(Android开发)