Java 在android附带的sqlite数据库文件中使用SQLCipher

Java 在android附带的sqlite数据库文件中使用SQLCipher,java,android,sqlcipher,Java,Android,Sqlcipher,我在资产文件中重置了一个数据库文件 如何使用SQLCipher在android中加密数据库?他们在网站上详细介绍了如何使用SQLCipher 基本上,您可以下载它们的二进制文件,在项目中设置它们,然后使用它们的SQLiteDatabase类而不是标准的android SQLiteDatabase类: import info.guardianproject.database.sqlcipher.SQLiteDatabase; 这会有点复杂。由于SQLite和sqlcipherforandroi

我在
资产
文件中重置了一个数据库文件


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

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

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

 import info.guardianproject.database.sqlcipher.SQLiteDatabase;

这会有点复杂。由于SQLite和sqlcipherforandroid的数据库文件格式不同,而且您希望提供一个未加密的数据库,因此您必须做一些事情

首先,我要开始向您的环境交付未加密的数据库

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

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

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


这可能是对SQLite密码数据库的有用扩展,有一天…

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

使用这些导入:

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()
方法所示。

由于附带的数据库已经加密,因此您将无法使用用户选择的密码对其重新加密。这意味着加密是没有意义的,所以只需使用常规的SQLite,也许可以使用
sqliteAssetPer
来处理资产部分中的数据库包。你说“已发送的数据库将已加密”是什么意思?我没有加密它?啊!没关系,我很抱歉。好吧,你说你在资产文件夹中有一个数据库,你想加密它。。。因此,用户将无法对其重新加密。但是,你可以不加密地发送它,并且在应用程序中有一个函数,让用户在第一次运行时对它进行加密。假设在这种情况下,我发布了一个可能会有所帮助的答案。但是,数据库文件格式不同,因此您不能将其用于应用程序预打包或从某处下载的未加密数据库文件。Arrgh。没有深入阅读他们的文档来意识到这一点,并且犯了一个错误,因为它是一个android版本,所以会自动兼容(是的,我知道,这是一个严重的错误)。谢谢你指出。在我用密码发送数据库之前,我不能加密它吗?@user4o01:不,因为数据库应该用用户选择的密码加密。因此,如果任何人获得我的apk文件,都将获得数据库并可以读取其内容?@user4o01:当然。他们总能做到这一点。如果您不希望人们阅读您的数据,请不要向他们提供您的数据。用你自己的加密密钥加密你的数据库不会有帮助,因为人们只会从你的应用程序中取出密钥并使用它。如果您将数据放在用户的设备上,它现在是用户的数据,而不是您的数据。使用SQLCipher for Android帮助用户保护自己的数据免受他人攻击;您不能使用SQLCipher for Android来保护用户的数据不受用户攻击。@Commonware只需要对此提出建议。我已经成功地实现了sqlite asset helper,当我将压缩的db文件
未加密
添加到assets文件夹时,它可以正常工作,但当我将压缩的
加密
文件添加到assets文件夹时,它不能正常工作。