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 打不开。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
数据库表级密SM4的使用方法如下: 1. 首先,在配置文件中修改数据库连接信息和密密钥。打开配置文件(nacos-server-1.4.1\nacos\conf\application.properties),找到相关的配置项: - 修改数据库连接URL:将db.url.0的值修改为你的数据库连接URL。 - 修改数据库用户名和密码:将db.user.0和db.password.0的值修改为你的数据库用户名和密码。 - 添密密钥:在配置文件中添db.sm4Key.0的配置项,并将其值设置为你的密密钥。 2. 生成密密钥:使用工具类生成密密钥。可以编写一个Java程序,调用相关的工具类生成密密钥。示例代码如下: ```java import com.alibaba.nacos.common.utils.ByteUtils; import com.alibaba.nacos.common.utils.Sm4Util; public class GenerateSM4Key { public static void main(String[] args) throws Exception { byte[] genKeyBs = Sm4Util.generateKey(); String genKeyStr = ByteUtils.toHexString(genKeyBs); System.out.println("生成的密密钥:" + genKeyStr); } } ``` 3. 执行数据库脚本:在本地MySQL数据库中创建一个名为nacos_config的数据库。然后,在nacos数据库中执行distribution/conf/nacos-mysql.sql脚本,该脚本会初始化数据库表结构。 4. 启动Nacos服务:启动Nacos服务,它将使用配置文件中的数据库连接信息和密密钥来进行数据库表级密。 通过以上步骤,你就可以使用数据库表级密SM4来保护Nacos的数据安全了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值