【发布时间】:2015-01-22 05:32:23
【问题描述】:
我已经开发了一个使用 sqlite 数据库的应用程序。现在我想使用 SQLcipher 加密数据库。我可以使用 SQLcipher 加密我现有的数据库吗?
【问题讨论】:
标签: java android sqlite sqlcipher
我已经开发了一个使用 sqlite 数据库的应用程序。现在我想使用 SQLcipher 加密数据库。我可以使用 SQLcipher 加密我现有的数据库吗?
【问题讨论】:
标签: java android sqlite sqlcipher
SQLCipher 用于 Android 应用程序集成 本教程将介绍将 SQLCipher for Android 的二进制文件集成到 Android 应用程序中。本教程假设 Android SDK 已经安装在本地开发机器上。
创建示例 Android 应用程序 要创建示例 Android 应用程序,请发出以下命令:
% mkdir demo-app
% cd demo-app
% android create project \
--target android-10 \
--name demoapp \
--path . \
--activity HelloSQLCipherActivity \
--package com.demo.sqlcipher
获取二进制文件 SQLCipher for Android 的源代码在 Github.com 上公开维护,当前的二进制版本可以在这里找到。有关为 Android 构建 SQLCipher 源的信息,请参阅以下说明。我们将使用以下命令手动下载压缩 tar 文件的内容并将其解压缩到您的应用程序根目录中:
% curl -L -o sqlcipher-for-android.zip https://s3.amazonaws.com/sqlcipher/SQLCipher+for+Android+v3.1.0.zip
% unzip sqlcipher-for-android.zip
我们需要将各种库和资产文件复制到应用程序的根目录中。执行以下命令:
% cp -R SQLCipher\ for\ Android\ v3.1.0/libs/* libs
% cp -R SQLCipher\ for\ Android\ v3.1.0/libs/*assets
演示应用程序的文件应该类似于以下结构:
集成
从菜单中启动 Eclipse 和 choose File -> New -> Android Project。为项目命名并选择从指向您的应用程序根目录的现有源中创建项目。它应该类似于:
接下来我们需要引用 libs 目录中的 3 个 jar 文件。右键单击 Package Explorer 中的项目节点并选择 Build Path -> "Configure Build Path..."。选择库选项卡并按"Add JARs..." 按钮。选择commons-codec.jar, guava-r09.jar and sqlcipher.jar。选择这三个罐子后,屏幕应该是这样的:
接下来我们将修改默认活动的源以正确初始化 SQLCipher 的本机库,然后创建插入记录的数据库文件。特别要注意net.sqlcipher.database.SQLiteDatabase 的导入而不是android.database.sqlite.SQLiteDatabase 以及对SQLiteDatabase.loadLibs(this) 的调用。对SQLiteDatabase.loadLibs(this) 的调用必须在任何其他数据库操作之前发生。
package com.demo.sqlcipher;
import java.io.File;
import net.sqlcipher.database.SQLiteDatabase;
import android.app.Activity;
import android.os.Bundle;
public class HelloSQLCipherActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
InitializeSQLCipher();
}
private void InitializeSQLCipher() {
SQLiteDatabase.loadLibs(this);
File databaseFile = getDatabasePath("demo.db");
databaseFile.mkdirs();
databaseFile.delete();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null);
database.execSQL("create table t1(a, b)");
database.execSQL("insert into t1(a, b) values(?, ?)", new Object[]{"one for the money",
"two for the show"});
}
}
示例应用程序现在应该可以在模拟器或设备上运行了。
SQLCipher for Android 构建教程
本教程将介绍从头开始构建 SQLCipher for Android 的源代码。本教程针对的是 Android NDK 的第 7 版,适用于 Linux 或 OSX 环境下的复杂性。
系统环境要求
为了构建适用于 Android 的 SQLCipher 的源代码,需要几个工具。包括Android SDK, Android NDK and the JDK 在内的几个开发工具包需要存在于构建机器上。我们需要PATH 上可用的ANDROID_NDK_ROOT 环境变量。您还需要 Git 来获取源代码树。要验证您的 PATH 是否正确配置,请执行以下命令:
% which ndk-build
/Users/nparker/bin/android-ndk/ndk-build
如果您收到 ndk-build not found 您需要将以下内容添加到您的 .bashrc 或相应的 shell 配置文件中。注意下面~/bin/android-ndk路径代表我机器上Android NDK根目录的位置,相应调整:
export ANDROID_NDK_ROOT=~/bin/android-ndk
export PATH=$ANDROID_NDK_ROOT:$PATH
我们将使用 Make 作为与 NDK 工具链交互的基础构建工具。
获取来源
SQLCipher for Android 的源代码在 Github.com 上公开维护。我们将从在本地克隆存储库开始:
% cd ~/code
% git clone git://github.com/sqlcipher/android-database-sqlcipher.git
建筑 构建代码的过程分为两个不同的阶段。第一次执行此操作时,我们需要初始化 SQLCipher for Android 所依赖的各种 git 子模块。这一切都是通过 Make 自动完成的。
% cd android-database-sqlcipher
% make init
一旦 git 完成了编译所需的各种子模块的下拉,我们就可以开始构建过程了:
% 制作 此过程需要一些时间才能完成。完成后,您应该可以将以下文件集成到应用程序的 libs 目录中:
% tree libs
libs
├── armeabi
│ ├── libdatabase_sqlcipher.so
│ ├── libsqlcipher_android.so
│ └── libstlport_shared.so
├── commons-codec.jar
├── guava-r09.jar
└── sqlcipher.jar
本地化依赖
适用于 Android 的 SQLCipher 依赖于来自 ICU 项目的本地化数据。 SQLCipher for Android 将尝试使用系统提供的名为icudt46l.dat 的ICU 本地化数据文件,该文件位于/system/usr/icu directory(如果可用)。如果未找到,SQLCipher for Android 将尝试解压缩位于应用程序资产目录中的icudt46l.zip 文件。建议将icudt46.zip 文件包含在您的应用程序中以获得最佳平台兼容性。
【讨论】: