如何在SQLite数据库中使用加密

时间:2015-01-22 05:32:24

标签: java android sqlite sqlcipher

我开发了一个我正在使用sqlite数据库的应用程序。现在我想使用SQLcipher加密数据库。我可以使用SQLcipher加密现有数据库吗?

1 个答案:

答案 0 :(得分:1)

适用于Android应用程序集成的

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 

演示应用程序的文件应与此结构类似:

enter image description here

集成 从菜单中启动Eclipse和choose File -> New -> Android Project。为项目命名,然后选择“从现有源创建项目”,指向应用程序根目录。它看起来应该类似于: enter image description here

接下来我们需要在libs目录中引用3个jar文件。右键单击Package Explorer中的项目节点,然后选择Build Path -> "Configure Build Path..."。选择Libraries选项卡,然后按"Add JARs..."按钮。选择commons-codec.jar, guava-r09.jar and sqlcipher.jar。选择这三个罐子后,屏幕应如下所示:

enter image description here

接下来,我们将修改默认活动的源,以正确初始化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文件,以获得最佳平台兼容性。

参考:https://www.zetetic.net/sqlcipher/sqlcipher-for-android/