python利用windows编译的sqlcipher工具对sqlite数据库加密

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaobai_ol/article/details/75221097

用python进行sqlite加密,这里选择的还是sqlcipher。其实在python中,python也集成了python的sqlcipher扩展包:pysqlclipher,奈何在这里安装这个扩展包我觉得很麻烦(关于安装方法点这里),于是我放弃了这个,打算用已经编译好的windows的sqlcipher工具。

  这里,关于sqlcipher.exe的下载链接可以看这个:点击打开链接,我这里下载的是3.x版本的,2.x版本的我没有用。这里也给出2.x版本的地址及使用方法点击打开链接

下载完之后,只需要在bin文件夹中找到sqlcipher-shell32.exe或者sqlcipher-shell84.exe,bin文件夹里其他的文件貌似都没有用(这里我尝试是没有用的)。这里看你的windows机器是32位或者64位,然后打开对应的exe可执行文件会出现以下的提示:

SQLCipher version 3.8.0.2 2013-09-03 17:11:13
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

记住这里要运行的话不能直接打开exe,因为你要用该工具去处理或者新建的sqlite数据库文件,所以这里采用在cmd下运行。

打开cmd,cd到exe文件所在的目录下,然后输入命令:sqlcipher.exe -help,这里就会列出它的用法,具体可以敲该命令看看。好了,这里我们先来在命令行下利用该工具加密一个已存在的未加密的sqlite数据库(暂且叫它origin.db)吧具体如下:

F:\Download>sqlcipher64.exe origin.db
SQLCipher version 3.8.0.2 2013-09-03 17:11:13
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> ATTACH DATABASE 'encrypt.db' AS encrypted KEY 'thiskey';
sqlite> SELECT sqlcipher_export('encrypted');

sqlite> DETACH DATABASE encrypted;
sqlite> .q

这里sqlcipher64.exe与origin.db文件在F盘的Download目录下;

sqlcipher64.exe origin.db            //打开一个sqlite数据库文件,如果不存在则进行新建
ATTACH DATABASE 'encrypt.db' AS encrypted KEY 'thiskey';         //新建一个数据库文件,并打开连接。这里encrypt.db是用来当作加密后的db文件,encrypted是该数据库的别名,“thiskey”是新建的这个数据库文件的密码
SELECT sqlcipher_export('encrypted');              //拷贝原数据库文件数据到新建的encrypt.db文件中
DETACH DATABASE encrypted;                    //断开连接
最后的.q是quit退出的意思。注意上面的sqlite语句后面都加的有分号。

当执行完上面的程序后,Download文件夹下就会有一个加密了的encrypt.db文件。


当然如果批量操作加密数据库文件或者是自动化操作,当然是选择用脚本处理啊,之类的。这里先给出python自动化执行的的具体代码:

import os
import sys
import subprocess
import platform


def encryptDB(DBName):                           # 传入未加密的文件
    if not os.path.exists(DBName):
        print 'not have the download db,can not encrypt'
    else:
        encryptedDBName = 'encrypt.db'
        if os.path.exists(encryptedDBName):
            os.remove(encryptedDBName)
        os_bit = platform.architecture()[0]             # 判断系统是64位还是32位来选择对应的文件
        openToolName = 'sqlcipher64.exe'
        if os_bit == '32bit':
            openToolName = 'sqlcipher32.exe'
        cmd = "%s %s -init cmd .q" % (openToolName, DBName)       #调用该命令来执行生成加密文件
        os.system(cmd)
        if os.path.exists(encryptedDBName):
            print 'the database has encrypted successfully,please use the %s for WordingAPK' % encryptedDBName
        else:
            print 'database encrypted fail'


if __name__ == '__main__':
    pyPath = os.path.split(os.path.realpath(sys.argv[0]))[0]
    os.chdir(pyPath)
    print pyPath
    encryptDB('origin.db')
cmd文件

ATTACH DATABASE 'encrypt.db' AS encrypted KEY 'thisiskey';
SELECT sqlcipher_export('encrypted');
DETACH DATABASE encrypted;

注意,其实最重要的就是上面的那句标红的cmd命令,(开始以为很简单,把那些sqlite语句命令都当作系统命令调用去写了 哭,结果发现第一句执行完之后系统就卡住了,原来那些sqlite语句是在该工具的进程里面执行的),最后经过尝试,看了一下-help命令,发现-init是在该"工具执行之前运行-init后跟的文件内的命令"的意思,所以代码里面的cmd命令意思就是用工具打开未加密的文件,然后运行-init后跟的cmd文件内的sqlite语句命令,最后.q退出。这里的cmd文件我没有命名文件格式,直接notepad++打开,放入sqlite命令。最后运行即可。这里cmd文件也在Download文件目录下,执行上面python代码就可以生成加密后的encrypt.db文件啦。


顺便这里说下,我用该加密脚本在电脑上加密了sqlite数据库文件,然后在android APP内用sqlcipher解密是可以的哦,这也多亏了sqlcipher的跨平台性。

猜你喜欢

转载自blog.csdn.net/xiaobai_ol/article/details/75221097
今日推荐