2016-02-12 71 views
1

我的開發環境: C/C++,CentsOS,Openssl,sqlite3。如何正確地將加密數據插入數據庫並從中檢索?

我使用openssl EVP接口(AES 128位)加密數據。加密的數據可能包含空值。我怎樣才能正確地插入到sqlite3數據庫,並從數據庫中取回解密?

謝謝。

+0

將其轉換爲十六進制ASCII(因此'x00'將變成'x30x30')或將其轉換爲Base64。 –

回答

1

我該如何正確地將它插入sqlite3數據庫並從數據庫中取回解密?

我想你至少有兩個選擇。首先,你可以編碼你的密文。這可以在OpenSSL或數據庫中完成。如果您使用OpenSSL,請在手冊頁中查看BIO_f_base64

我不知道你會用什麼來使用數據庫函數編碼二進制數據。爲此,請參閱SQL As Understood By SQLite | Core Functions

其次,您可以放棄編碼並簡單地存儲二進制blob。 blob是SQLite中的數據類型,請參閱Datatypes In SQLite Version 3。另請參閱SQLite Blob insertion c++SQLite not storing blobs containing \0 bytes等問題。

避免編碼和直接使用二進制數據可能是最有效的方法,因爲它避免了額外的工作。但是在某些情況下它會使搜索數據變得更加困難。


可能有第三個選項,但它取決於您的威脅模型。您可以加密整個數據庫,然後在其中插入純文本。有關該選項,請參閱SQLite with encryption/password protection

由於密鑰管理,此選項可能不如在加密數據前進行安全。如果數據庫需要聯機,那麼加密整個數據庫的密鑰必須存儲在某個地方,這意味着攻擊者可能會從文件系統中恢復它。

+0

感謝您的幫助。到目前爲止,不需要加密整個數據庫或密碼保護功能。我將使用Base64編碼方法。我嘗試blob,但我怎麼能從數據庫檢索它?我使用blob插入了一個包含null的字符串,但是當我使用「sqlite3_column_blob」檢索它時,結果字符串將不包含完整數據。我的意思是說,如果插入一個字符串「text \ 0abc」,我將只返回「文本」我做錯了什麼? –

+0

我知道C字符串是以'\ 0'結尾的。我應該做些什麼? –

+0

@abhaykanade - 這聽起來像你正在碰到在[SQLite不存儲包含\ 0字節的blob](http://stackoverflow.com/q/13825164)中討論的問題。你有沒有回顧過這個問題和答案? – jww

相關問題