【问题标题】:How to use encryption in SQLite database [duplicate]如何在 SQLite 数据库中使用加密 [重复]
【发布时间】:2015-01-22 05:32:23
【问题描述】:

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

【问题讨论】:

    标签: java android sqlite sqlcipher


    【解决方案1】:

    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 文件包含在您的应用程序中以获得最佳平台兼容性。

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

    【讨论】:

    • 您能否准确说明您是如何找到二进制文件的?我没有看到你说可以在“这里”找到它的链接,当我从 Zetetic 页面转到二进制下载时,我在bintray.com/bintray/jcenter/… 结束,上面写着“没有为此包选择直接下载”。我不知道如何选择一个。
    • 顺便说一句,您的链接适用于 3.1.0,但如果我天真地将其替换为 3.3.1 或 3.3.1-2,它将失败。
    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 2019-11-17
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多