我开发了一个我正在使用sqlite数据库的应用程序。现在我想使用SQLcipher加密数据库。我可以使用SQLcipher加密现有数据库吗?
答案 0 :(得分:1)
SQLCipher 本教程将介绍将Android的SQLCipher二进制文件集成到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..."
。选择Libraries选项卡,然后按"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"});
}
}
示例应用程序现在应该能够在模拟器或设备上运行。
适用于Android Build Tutorial的SQLCipher
本教程将介绍如何从头开始构建适用于Android的SQLCipher的源代码。本教程面向Android NDK的第7版,适用于Linux或OSX环境下的复杂功能。
系统环境要求
为了构建Android的SQLCipher源,需要几个工具。构建机器上需要包含Android SDK, Android NDK and the JDK
的几个开发工具包。我们需要ANDROID_NDK_ROOT
上提供的PATH
环境变量。您还需要Git来获取源树。要验证您的PATH
配置是否正确,请执行以下命令:
% which ndk-build
/Users/nparker/bin/android-ndk/ndk-build
如果您收不到ndk-build,则需要将以下内容添加到.bashrc
或相应的shell配置文件中。请注意,下面的~/bin/android-ndk
路径表示我的计算机上Android NDK根目录的位置,并进行相应调整:
export ANDROID_NDK_ROOT=~/bin/android-ndk
export PATH=$ANDROID_NDK_ROOT:$PATH
我们将使用Make作为我们的基础构建工具来与NDK工具链进行交互。
获取来源
Android版SQLCipher的源代码在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完成了下载编译所需的各个子模块,我们就可以开始构建过程了:
%make 此过程需要一些时间才能完成。完成后,您应该可以使用以下文件集成到应用程序的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
文件,以获得最佳平台兼容性。