用sqlcipher对已有的SQLite数据库加密

    本人最近在学习Android程序,用到了SQLite数据库,但是到最后却很纠结地发现android中的SQLite没法添加密码,很坑爹。网上寻找了很多资料,最多说的是用sqlcipher加密,这个方案确实不错,但是接着的问题才是最重要的:网上给出的sqlcipher方案例子都是新建带密码的数据库,然后添加数据,我几十兆的数据总不能逐条写吧?(其实也可以,但是比较懒。)又查了很多资料,发现用到的最多的是sqlcipher的命令模式直接改密码,但是本人初学android,没有看懂(真心希望懂的人教一教),真是搞不明白为什么sqlcipher不做一个改密码的函数!(或者我不知道?)

    以上各种感受,现在说说我的方法吧:

    直接改密码是不行了,找了一个折中的办法:

     1.新建一个代密码的数据库;

     2.连接(attach)原数据库;

     3.直接拷贝表。

         Sqlcipher的具体用法不描述了,和androidSqlite的函数都是一样的,仅仅是在新建、打开等操作时多了一个密码的参数,不懂的话可以百度搜,以下我只列出了需要用到的关键语句(本文中的所有SQLiteDatabase类都是net.sqlcipher.database.SQLiteDatabase不是android中的SQLiteDatabase)。。

    首先新建一个带密码的数据库:

SQLiteDatabase dataTarget =SQLiteDatabase.openOrCreateDatabase([这里填新建加密数据库文件路径], [这里是数据库密码],null);

   新数据库连接老数据库:

//链接数据库
      dataTarget.execSQL("attach '"+[这里填原数据库文件路径]+"' as sourceLib key '';");// sourceLib是老数据库的别名,第二个参数是密码,由于原数据库没有加密所以密码为:’’。

     新建拷贝表:

dataTarget.execSQL("select * into[表名] from sourceLib.[表名]");
    有几个表执行几次。  

   需要说明的是,这种方式新建的表没有原表的主键默认值等信息,如果要保留主键默认值等信息用如下方法:

      1.新建加密数据库;(同上,略)

      2.新建表,同原表结构;

      这一步可以用SQLite Expert等软件直接提取到SQL脚本复制到编程语句即可。如下图:

            

      3.链接原数据库;(同上,略)

      4.insert语句拷贝表:

dataTarget.execSQL("insert into[表名] select * from sourceLib.[表名]");

 

以上即可完成。


如果你的 Python 程序无法读取已加密SQLite 数据库,可能有以下几个原因: 1. 没有安装 SQLite 加密扩展。SQLite 加密需要使用 SQLite 加密扩展,你需要先使用 pip 安装 pysqlcipher3 或者 pysqlite3 这两个扩展库。 2. 密码错误。如果你在打开加密SQLite 数据库时输入了错误的密码,Python 将无法读取数据库的数据。请确保密码正确。 3. Python 版本不兼容。SQLite 加密扩展可能只支持特定版本的 Python,因此请务必检查你的 Python 版本是否与所使用的扩展库兼容。 4. 使用了错误的加密算法。SQLite 支持多种加密算法,如 AES-128、AES-192、AES-256 等。如果你使用了错误的加密算法,Python 也无法读取数据库的数据。 解决方法: 1. 确认已经安装了 SQLite 加密扩展。你可以使用以下命令来安装 pysqlcipher3 或者 pysqlite3: pip install pysqlcipher3 或者 pip install pysqlite3 2. 确认密码是否正确。在 Python 打开加密SQLite 数据库时,需要提供正确的密码。你可以尝试使用 SQLite 命令行工具打开数据库并输入密码,以确保密码正确。 3. 确认 Python 版本是否兼容。请查看 SQLite 加密扩展的文档,确认它支持的 Python 版本是否与你所使用的 Python 版本兼容。 4. 确认使用加密算法是否正确。你可以尝试使用不同的加密算法打开数据库,以找到正确的算法。你也可以查阅 SQLite 加密扩展的文档,以确定正确的加密算法。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值