【问题标题】:using SQLCipher with android shipped sqlite database file将 SQLCipher 与 android 提供的 sqlite 数据库文件一起使用
【发布时间】:2012-05-11 01:43:23
【问题描述】:

我在assets 文件中重置了一个数据库文件。

如何在android中使用SQLCipher加密数据库?

【问题讨论】:

  • 由于交付的数据库已经加密,您将无法使用用户选择的密码重新加密它。这意味着加密是没有意义的,所以只需使用常规 SQLite,也许使用 SQLiteAssetHelper 来处理 package-the-database-in-assets 部分。
  • 你的意思是“发货的数据库已经被加密了”我没有加密它?
  • 啊!没关系,我很抱歉。
  • 嗯,你说你在资产文件夹中有一个数据库,你想加密它......因此用户将无法重新加密它。但是,您可以将其发送未加密并在应用程序中有一个功能,让用户在第一次运行时对其进行加密,我想。假设我发布了一个可能有帮助的答案。

标签: java android sqlcipher


【解决方案1】:

这会有点复杂。由于 SQLite 和 Android 的 SQLCipher 之间的数据库文件格式不同,并且由于您要发送未加密的数据库,因此您必须做一些事情。

首先,我会让SQLiteAssetHelper 将未加密的数据库交付到您的环境中。

然后,使用适用于 Android 的标准 SQLCipher 创建一个空但加密的数据库。

接下来,您需要实现代码,将数据从打包但未加密的数据库中复制出来,并将其插入到空但加密的数据库中。

完成后,您可以关闭并删除打包但未加密的数据库,只使用加密的数据库。

这可能会成为SQLiteAssetHelper 的有用扩展,有朝一日...

【讨论】:

  • 我不能在使用密码发送数据库之前对其进行加密吗?
  • @user4o01:不,因为数据库应该使用用户选择的密码进行加密。
  • 所以如果有人得到我的 apk 文件将得到数据库并可以读取它的内容?
  • @user4o01:当然。他们总能做到这一点。如果您不希望人们阅读您的数据,请不要向他们提供您的数据。使用您自己的加密密钥加密您的数据库将无济于事,因为人们只会从您的应用程序中获取密钥并使用它。 如果您将数据放在用户的设备上,那么它现在是用户的数据,而不是您的数据。 使用 SQLCipher for Android 帮助用户保护他们的数据免受他人侵害;您不能使用 SQLCipher for Android 来保护用户的数据免受用户攻击。
  • @CommonsWare 只需要对此提出建议。我已经成功实现了 sqlite-asset-helper,当我将压缩的 db 文件 unencrypted 添加到 assets 文件夹时它可以正常工作,但是当我将压缩的 encrypted 文件添加到 assets 文件夹时它不会。
【解决方案2】:

他们在他们的网站here上详细介绍了如何使用 SQLCipher

基本上你下载他们的二进制文件,在你的项目中设置它们,然后使用他们的 SQLiteDatabase 类而不是标准的 android SQLiteDatabase 类。:

 import info.guardianproject.database.sqlcipher.SQLiteDatabase;

【讨论】:

  • 但是,数据库文件格式不同,因此您不能将其与您的应用程序预打包或从某处下载的未加密数据库文件一起使用。
  • 啊。没有深入阅读他们的文档以意识到这一点,并且错误地假设它是 android 的版本,它会自动兼容(是的,我知道,大错特错)。感谢您指出。
【解决方案3】:

以下代码摘录可用于在 SQLite Cipher 数据库中创建多个表:

使用这些导入:

import java.sql.SQLException;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
import android.content.ContentValues;  
import android.content.Context;  
import android.database.Cursor;  
import android.util.Log;

/** Helper to the database, manages versions and creation */

    public class DBAdapter extends SQLiteOpenHelper {
        private static final String DATABASE_NAME = "Test";
        private static final int DATABASE_VERSION = 1;

        // Table name
        public static final String TABLE_1 = "Table1";
        public static final String TABLE_2 = "Table2";

        // Column names for Table1 table
        static final String KEY_PASSWORD = "password";
        static final String KEY_USER = "user";

        // Column names for Table2 table
        static final String KEY_EVENT = "event";
        static final String KEY_USERNAME = "username";


        public DBAdapter(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            String sql1 = "create table " + Table_1 + " (" + KEY_USER + " text primary key, " + KEY_PASSWORD + " text not null);";
            String sql2 = "create table " + Table_2 + " (" + KEY_EVENT + " text primary key, " + KEY_USERNAME + " text not null FOREIGN KEY(" + KEY_USERNAME + ") REFERENCES " + TABLE_1 + "(" + KEY_USER + "));";
            db.execSQL(sql1);
            db.execSQL(sql2);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            if (oldVersion >= newVersion){
                return;
            }

            String sql = null;
            if (oldVersion == 1) 
                sql = "alter table " + TABLE_1 + " add note text;";
            if (oldVersion == 2)
                sql = "";

            Log.d("EventsData", "onUpgrade  : " + sql);
            if (sql != null)
                db.execSQL(sql);
        } 

        public Cursor getAllUsers(String username, SQLiteDatabase db){
            return db.query(TABLE_1, ...);
        }

        public Cursor getAllEvents(String event, SQLiteDatabase db){
            return db.query(TABLE_2, ...);
        }
   }

现在您可以对两个表执行所有 CRUD 方法。只需确保每个方法都有一个SQLiteDatabase 作为参数,如getAllUsers() 方法中所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多