2017-03-09 55 views
0

SQLCipher中可以通過兩種方式提供數據庫密鑰:作爲密碼(具有相關數量的PBKDF2輪)或作爲原始密鑰。如何從密碼短語和PBKDF2迭代中獲取原始密鑰數據

我試圖找到一種方式獲得原始密鑰(作爲64個字符的十六進制字符串給出)給定密碼(任意字符串)和回合數。我假設解決方案在於以某種方式自己執行PBKDF2密鑰派生,但我不太熟悉這可能如何工作,或者它是否會生成一個值,我可以將其作爲原始密鑰提供給PRAGMA KEY。另外,PBKDF2函數似乎需要一個鹽,我不知道。如果必須的話,我相信我可以深入瞭解sqlcipher源代碼來弄清楚這一點,但我希望可能已經有一個簡單的方法來做到這一點,我錯過了。

回答

1

有關SQLCipher密鑰導出的詳細信息,請參見on the design page。 salt存儲在數據庫文件的前16個字節中。然後,您將使用salt以及相應數量的PBKDF2-HMAC-SHA1輪次(SQLCipher 3爲64,000,早期版本爲4,000)

+0

在閱讀本文後,我是否正確地認爲如果您使用原始鍵在文件的16個字節中沒有隨機鹽,所以你不能只是像預先計算散列鍵那樣進行處理,並把它當作一個原始密鑰,因爲它們沒有以相同的方式解密。 – Michael

+0

使用原始密鑰時SQLCipher不執行密鑰派生。文件開始處仍有隨機數據,但未使用。你能解釋一下你想完成什麼嗎? –

+0

從用戶指定的密碼短語遷移到某種形式的有保存的原始密鑰,但在此期間(在現有數據庫遷移之前)需要一種可以以任何方式工作的解決方案。可能只是檢測給定的密碼是否真的是原始密鑰,並相應地指定編譯指示。 – Michael