xutils结合sqlcipher给数据库加密码

android studio环境下的用法

我的工程里把xutils 2.x作为一个module库给主程序用的,所以可以修改xutils的源码来实现需求的变更。

一、添加资源:

前往:https://github.com/sqlcipher/sqlcipher-android-tests ,下载sqlcipher tests 提取assets目录下的icudt46l.zip和libs目录下的sqlcipher.jar、jniLibs目录下的libdatabase_sqlcipher.so、libsqlcipher_android.so、libstlport_shared.so到你主工程下,jniLibs目录的看你支持的cpu而定。然后,提取libs目录下的sqlcipher.jar到你的xutils库工程的libs下。

二、配置工程:

主工程的Dependencies 选项中sqlcipher.jar的Scope设置为Compile,xutils库工程中sqlcipher.jar的Scope设置为Provided,编译和支持用。

三、修改xutils中的DbUtils:

DaoConfig添加pwd:

public static class DaoConfig {
    private Context context;
    private String dbName = "xUtils.db"; // default db name
    private int dbVersion = 1;
    private DbUpgradeListener dbUpgradeListener;

    private String dbDir;
    
    private String pwd;//密码配置

    public DaoConfig(Context context) {
        this.context = context.getApplicationContext();
    }

    public Context getContext() {
        return context;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getDbName() {
        return dbName;
    }

    public void setDbName(String dbName) {
        if (!TextUtils.isEmpty(dbName)) {
            this.dbName = dbName;
        }
    }

    public int getDbVersion() {
        return dbVersion;
    }

    public void setDbVersion(int dbVersion) {
        this.dbVersion = dbVersion;
    }

    public DbUpgradeListener getDbUpgradeListener() {
        return dbUpgradeListener;
    }

    public void setDbUpgradeListener(DbUpgradeListener dbUpgradeListener) {
        this.dbUpgradeListener = dbUpgradeListener;
    }

    public String getDbDir() {
        return dbDir;
    }

    /**
     * set database dir
     *
     * @param dbDir If dbDir is null or empty, use the app default db dir.
     */
    public void setDbDir(String dbDir) {
        this.dbDir = dbDir;
    }
}

create方法添加password参数,如下:

public static DbUtils create(Context context,String pwd) {
    DaoConfig config = new DaoConfig(context);
    config.setPwd(pwd);//添加密码
    return getInstance(config);
}

public static DbUtils create(Context context, String dbName,String pwd) {

    DaoConfig config = new DaoConfig(context);
    config.setDbName(dbName);
    config.setPwd(pwd);//添加密码
    return getInstance(config);
}

public static DbUtils create(Context context, String dbDir, String dbName,String pwd) {
    DaoConfig config = new DaoConfig(context);
    config.setDbDir(dbDir);
    config.setDbName(dbName);
    config.setPwd(pwd);//添加密码
    return getInstance(config);
}

public static DbUtils create(Context context, String dbName,String pwd, int dbVersion, DbUpgradeListener dbUpgradeListener) {
    DaoConfig config = new DaoConfig(context);
    config.setDbName(dbName);
    config.setPwd(pwd);//添加密码
    config.setDbVersion(dbVersion);
    config.setDbUpgradeListener(dbUpgradeListener);
    return getInstance(config);
}

public static DbUtils create(Context context, String dbDir, String dbName,String pwd, int dbVersion, DbUpgradeListener dbUpgradeListener) {
    DaoConfig config = new DaoConfig(context);
    config.setDbDir(dbDir);
    config.setDbName(dbName);
    config.setPwd(pwd);//添加密码
    config.setDbVersion(dbVersion);
    config.setDbUpgradeListener(dbUpgradeListener);
    return getInstance(config);
}

getInstance 方法添加代码,加载.so动态库:

private synchronized static DbUtils getInstance(DaoConfig daoConfig) {
    SQLiteDatabase.loadLibs(daoConfig.getContext());//添加动态库
    DbUtils dao = daoMap.get(daoConfig.getDbName());
    if (dao == null) {
        dao = new DbUtils(daoConfig);
        daoMap.put(daoConfig.getDbName(), dao);
    } else {
        dao.daoConfig = daoConfig;
    }

    // update the database if needed
    SQLiteDatabase database = dao.database;
    int oldVersion = database.getVersion();
    int newVersion = daoConfig.getDbVersion();
    if (oldVersion != newVersion) {
        if (oldVersion != 0) {
            DbUpgradeListener upgradeListener = daoConfig.getDbUpgradeListener();
            if (upgradeListener != null) {
                upgradeListener.onUpgrade(dao, oldVersion, newVersion);
            } else {
                try {
                    dao.dropDb();
                } catch (DbException e) {
                    LogUtils.e(e.getMessage(), e);
                }
            }
        }
        database.setVersion(newVersion);
    }

    return dao;
}

createDatabase方法修改

 private SQLiteDatabase createDatabase(DaoConfig config) {
        SQLiteDatabase result = null;

        String dbDir = config.getDbDir();
        if (!TextUtils.isEmpty(dbDir)) {
            File dir = new File(dbDir);
            if (dir.exists() || dir.mkdirs()) {
                File dbFile = new File(dbDir, config.getDbName());
                result = SQLiteDatabase.openOrCreateDatabase(dbFile.getPath(),config.getPwd(),null);//替换为sqlcipher的方法
            }
        } else {
            //替换为sqlcipher的方法
            SQLiteOpenHelper dbhelper = new SQLiteOpenHelper(config.getContext(),config.getDbName(),null,config.getDbVersion()) {
                @Override
                public void onCreate(SQLiteDatabase sqLiteDatabase) {

                }

                @Override
                public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

                }
            };
            result = dbhelper.getWritableDatabase(config.getPwd());
//            result = config.getContext().openOrCreateDatabase(config.getDbName(), 0, null);
        }
        return result;
    }

其它目录下com.lidroid.xuitls.db包下的annotation、converter、sqlite、table的java文件中替换Coursor

//import android.database.Cursor;
import net.sqlcipher.Cursor;

这样手术就结束了,DbUtil用法不变就多了pwd参数。

sqlcipher应该是AES加密,我把加密的.db导出来准备用SQLiteManager 和SQLPro for SQLite 这两个工具查看数据库,SQLiteManager需要输入密码,SQLPro for SQLite 打不开。



评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值