2011-03-25 45 views
2

我試圖使用sqlcipher創建數據庫,然後通過使用密碼密鑰的十六進制值來訪問它。 根據github(https://github.com/sjlombardo/sqlcipher)的描述,sha256算法對密鑰進行哈希處理,然後用於密文數據庫。可以通過PRAGMA指令以普通和十六進制形式提供密鑰。如果我使用普通版本,它可以正常工作,但我無法使用十六進制鍵值訪問數據庫。 例如在我的情況下,鍵是'演示',當我使用PRAGMA key='demo'所有的作品。 我得到了sha256:sqlcipher:無法訪問提供十六進制密鑰的數據庫

echo -n demo | shasum -a256 2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea

,然後根據sqlite3_exec調用指令提供給編譯指令:

sqlite3_exec(db, "PRAGMA key = x'2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea'", NULL, NULL, NULL); 

但這不起作用。

我應該向PRAGMA指令提供的密鑰的十六進制值是什麼?

回答

3

傳遞文本值與原始十六進制值相關的雜注鍵的結果不可互換。

  • 如果您通過提供關鍵PRAGMA =「演示」一文鍵,SQLCipher使用PBKDF2派生密鑰的數據(見http://sqlcipher.net/design)。這使用一個隨機的數據庫鹽和默認4000次迭代。
  • 如果提供十六進制密鑰,則SQLCipher直接使用二進制值作爲密鑰而不派生。

因此,您提到的兩種模式之間的實際加密密鑰會有很大不同。如果您不確定要使用哪種方法,則應該默認使用第一種方法,因爲密鑰派生步驟可以更好地防範暴力和字典攻擊。

我會嘗試在未來更新自述文件,以使其更清晰。

+0

非常感謝! – user478681 2011-03-25 16:39:52

+0

那麼呃...當密鑰包含不可打印的字符時,如何從PRAGMA界面設置密鑰?如果我在引號之間強制奇怪的二進制值字符,即使我確保將單引號加倍,似乎也無法工作。 – Michael 2017-02-05 05:08:31

+0

此外,如果我嘗試相反的方式,調用sqlite3_key,然後發佈'PRAGMA kbd_iter = 0'它似乎不具有相同的效果,如果使用'PRAGMA key =「x'...'」' – Michael 2017-02-05 05:09:51