python利用windows編譯的sqlcipher工具對sqlite數據庫加密

用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的跨平臺性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章