對於一個小型的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的完全不同的方式來解決正確隱藏密鑰的問題?
修訂號該程序應使用戶能夠檢查搜索項是否屬於數據庫的一部分。但是用戶不應該被允許完整地查看數據庫。
不知何故,這種密鑰總是必須在某些時候出現在系統中 - 唯一不需要的解決方案是將解密移動到基於網絡的服務(其中服務器位於網絡連接的另一端是密鑰存儲的唯一位置)。您可以使用簡單的加密/編碼[如十六進制編碼和轉置位],但最終會存在某處。 – 2015-04-04 17:40:41
可以從內存中讀取密鑰的攻擊者也可以從內存中讀取解密的數據。 – 2015-04-04 17:56:42
這似乎沒有道理。當然,任何有權讀取RAM的人也有權獲得密鑰。如果你只把鑰匙交給有權獲得鑰匙的人,那沒有問題。爲什麼你會把鑰匙交給沒有授權的人?如果應用程序需要知道密鑰,那必須表示授權擁有/使用該應用程序的任何人也被授權擁有/使用密鑰?對?如果沒有,爲什麼應用程序有鑰匙? – 2015-04-04 20:18:56