python sqlite3加密_sqlite3加密 - kjpioo的个人空间 - OSCHINA - 中文开源技术交流社区...
SQLite 3 開源版不帶加密功能,對于一個保存在本地的數據庫來說沒有加密功能讓人難以接受,只要用記事本打開數據庫就可以看到數據庫內保存的數據,對安全多多少少有一點影響。有一個辦法是把內容加密后保存到數據庫中,但遇到類似 like,或字段內容與字段內容比較這就不行了。治本的辦法是讓 SQLite 原生的支持加密。好在 SQLite 的作者預留了加密解密的相關接口,許多愛好者也自己修改源版添加加密功能。如果你也在關注,那你可能已經閱讀了大量關于如何添加加密的文章,同時我也不是很通相關的技術,我就不再講解如何修改源碼了。雖然網上有大量的文章教你如何修改源碼,但都沒有提供編譯后的 DLL 文件,或者提供的 DLL 版本過低。
解決方案一:
這里介紹一個開源項目:wxSQLite3,該項目是一個 SQLite 的 C++ warpper,它順帶將 SQLite 的加密函數實現了,并且它使用 AES 算法進行加密。你可以在http://sourceforge.net/projects/wxcode/files/Components/下載到最新的包,在目錄 \sqlite3\secure 下你可以找到一個 sqlite3.dll 文件,這個就是已編譯的帶加密的 SQLite 3 DLL 文件,而且 wxSQLite3 項目更新很快,你總是可以下載到較新的包。在最新的1.9.8版本中開始對256位AES加密進行實驗,估計不久的版本就可以穩定使用。
使用起來也很簡單,首先打開數據庫 sqlite3_open,然后在操作數據庫之前執行 sqlite3_key 后就可進行數據庫操作,否則會返回錯誤。
sqlite3_key是輸入密鑰,如果數據庫已加密必須先執行此函數并輸入正確密鑰才能進行操作,如果數據庫沒有加密,執行此函數后進行數據庫操作反而會出現“此數據庫已加密或不是一個數據庫文件”的錯誤。
int sqlite3_key( sqlite3 *db, const void *pKey, int nKey),db 是指定數據庫,pKey 是密鑰,nKey 是密鑰長度。例:sqlite3_key( db, "abc", 3);
sqlite3_rekey是變更密鑰或給沒有加密的數據庫添加密鑰或清空密鑰,變更密鑰或清空密鑰前必須先正確執行 sqlite3_key。在正確執行 sqlite3_rekey 之后在 sqlite3_close 關閉數據庫之前可以正常操作數據庫,不需要再執行 sqlite3_key。
int sqlite3_rekey( sqlite3 *db, const void *pKey, int nKey),參數同上。
清空密鑰為 sqlite3_rekey( db, NULL, 0)。
缺點:
嚴重依賴于wxWidgets C++ library。不利于發布,編譯、維護繁瑣。要去除對wxwidgets的依賴,可以參考http://blog.csdn.net/tszhao/article/details/7254160這篇文章。
解決方案二:
SQLite數據庫的傳輸層進行全面加密的工具。而通過使用 SQLCipher ,整個加密過程對客戶端是透明的,無需改動應用程序。
SQLCipher has broad platform support for withC/C++, Obj-C, QT,Win32/.NET, Java, Python, Ruby, Linux,Mac OS X,iPhone/iOS,Android,Xamarin.iOS, andXamarin.Android.
SQLCipher對android和ios都是開源的。
windows支持:
android支持:
iphone支持:
待補充。
python支持:
SQLCipher is an SQLite extension that provides transparent 256-bit AES encryption of database files.
In order to encrypt a new database or query existing data you must key it before using it.
This app does it for you. You only need to specify the database key in your project's?settings.py?file.
For more about SQLCipher take a look at?http://sqlcipher.net/.
Requirements
python-sqlcipher (Python compiled with SQLCipher support)
For more about python-sqlcipher take a look at:
方案三:簡短內容不存儲在sqlite3中,用crypto加密成文件
在此我們將使用到PyCrypto模塊,可以訪問
http://www.pycrypto.org/?來獲得此模塊。該模塊包括多種加密算法,如AES、MD5、SHA等,我們可以訪問https://www.dlitz.net/software/pycrypto/apidoc/ 來查看相關API.
PyCrypto模塊的功能是非常強大的,此處僅起拋磚引玉的作用,感興趣的朋友可以穩步至其官方網站,其中有很多算法的例子。
[Python]代碼片段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#encoding:utf-8
"""
示例代碼
"""
fromCrypto.CipherimportAES
key='0123456789abcdef'
mode=AES.MODE_CBC
encryptor=AES.new(key, mode)
text='j'*64+'i'*128
ciphertext=encryptor.encrypt(text)
"""
上例中的key是16位, 還可以是24 或 32 位長度, 其對應為 AES-128, AES-196 和 AES-256.
解密則可以用以下代碼進行:
"""
#decryptor = AES.new(key, mode)
#plain = decryptor.decrypt(ciphertext)
歡迎加入 sqlite3?加密?全文搜索?討論組qq群號:?330649719
總結
以上是生活随笔為你收集整理的python sqlite3加密_sqlite3加密 - kjpioo的个人空间 - OSCHINA - 中文开源技术交流社区...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python监听多个udp端口_Pyth
- 下一篇: sql join on 多表连接_阿里规