2015-04-04 32 views
2

對於一個小型的C++/Qt應用程序,我想用SQLCipher擴展將存儲在SQLite數據庫中的數據存儲起來。如何隱藏內存(RAM)中的敏感字符串?

的關鍵,這是用來隱窩數據庫,必須由C++/Qt的應用是已知的,例如:

... 
q.exec("PRAGMA key = 'mysecretkey';"); 
... 

作爲該串中的二進制文件利用六角形是容易讀取編輯,我寫了創建了一個從哈希值在運行時的關鍵一小方法:

... 
q.exec("PRAGMA key='" + getKey().toHex() + "';"); 
... 


QByteArray getKey() { 
    ... 
} 

使用這種方法的關鍵是二進制文件不再是一部分,但仍處於時在RAM中存在執行查詢數據庫的方法。該方法完成後,該鍵在RAM中也不再可見。

你能幫助一個想法如何避免密鑰在RAM中可見嗎?或者,您是否推薦了一種基於C++/Qt和SQLite/SQLCipher-database的完全不同的方式來解決正確隱藏密鑰的問題?

修訂號該程序應使用戶能夠檢查搜索項是否屬於數據庫的一部分。但是用戶不應該被允許完整地查看數據庫。

+2

不知何故,這種密鑰總是必須在某些時候出現在系統中 - 唯一不需要的解決方案是將解密移動到基於網絡的服務(其中服務器位於網絡連接的另一端是密鑰存儲的唯一位置)。您可以使用簡單的加密/編碼[如十六進制編碼和轉置位],但最終會存在某處。 – 2015-04-04 17:40:41

+3

可以從內存中讀取密鑰的攻擊者也可以從內存中讀取解密的數據。 – 2015-04-04 17:56:42

+1

這似乎沒有道理。當然,任何有權讀取RAM的人也有權獲得密鑰。如果你只把鑰匙交給有權獲得鑰匙的人,那沒有問題。爲什麼你會把鑰匙交給沒有授權的人?如果應用程序需要知道密鑰,那必須表示授權擁有/使用該應用程序的任何人也被授權擁有/使用密鑰?對?如果沒有,爲什麼應用程序有鑰匙? – 2015-04-04 20:18:56

回答

0

當您爲該應用程序使用單個系統時,最有可能在本地主機上運行該應用程序。無論您使用任何數量的加密算法,密鑰最終都只會出現在內存中。 你也可以使用一種完全不同的方法,我真的推薦它是 - 使用負數據庫概念。 「

」負數據庫是一種數據庫,它包含大量的模擬數據,當有人試圖訪問這些數據庫時,實際數據集和負數據集都會被檢索出來,即使它們竊取了整個數據庫例如,不是隻存儲個人信息,而是存儲會員沒有的個人信息。「

這將保證您的數據安全,即使在後端。

+0

雖然我很欣賞這個問題不太可能有實際的答案,正如@CL。的評論所指出的那樣,應該指出,通過混淆的安全性不是安全性。 – cmannett85 2015-04-04 20:07:32

+0

但負數據庫提供了一個額外的安全層,它可以幫助我們使數據庫更安全。它用於銀行業和衛生保健行業。 – 2015-04-04 22:41:53

+0

我同意通過模糊處理的安全性並不是真正的安全性,但我發現負面的數據庫概念是一個額外的有趣的方式,使得獲取可用數據變得更加困難。 – Woodpecker 2015-04-04 22:44:07

相關問題