2011-04-10 76 views
5

我正在寫一個android密碼管理器應用程序,我想存儲主密碼的某處,但我不知道在哪裏。我是否應該使用我選擇的硬編碼密碼對用戶給予的主密碼進行加密,然後將其存儲到數據庫中?還是我應該做點別的?哪裏可以存儲密碼?

+4

密碼管理器的整個想法不是存儲主密碼嗎?您將個人密碼與主密碼一起存儲爲加密密鑰。主密碼永遠不會被存儲。 – Wolph 2011-04-10 13:43:53

回答

5

你不應該存儲未加密的密碼。

對於密碼,您無法安全地進行加密(因爲您必須將解密密鑰存儲在某個地方),您應該只存儲它的不可逆散列。

用這種方法,您可以在用戶提供密碼時將密碼與散列進行比較。如果匹配,則可以使用給定的密碼對存儲的用戶:密碼對進行解密。

PS:不要忘記鹽散列和please do it properly

+0

我會建議你重新閱讀他的問題。創建密碼管理器時,您需要存儲原始密碼;除非目標支持,否則散列不是一個選項。 – Wolph 2011-04-10 13:45:20

+1

@WoLpH:您可以使用主密碼加密密碼。但是,主密碼不必存儲。只需存儲它的散列就足夠了。 – 2011-04-10 13:46:52

+0

Scholly:我看到你修改了原來的答案。現在是正確的:) +1 – Wolph 2011-04-10 13:48:46

3

不,不,一千次沒有。

如果您可以查看GPLv2代碼,請查看KeePass源代碼。

主密碼變爲密鑰(基於密碼的密鑰派生),並且該密鑰用於加密和解密單個數據片段(單個密碼)。

因此,該過程與此類似: 1.關閉任何類型的交換到磁盤,您可以關閉。詢問用戶主密碼。

  1. 轉動主密碼到內存中的僅主加密密鑰,通過使用類似PBKDF2(HMAC-SHA-256,主密碼,存儲的隨機鹽*,2000000,256) - PBKDF2也稱爲RFC2898和PKCS#5。 HMAC-SHA-256是哈希函數。主密碼是用戶輸入的任何內容 - 這絕不會以任何形式保存!存儲的隨機鹽是一個64位或更大的加密隨機值,只要選擇一個新的主密碼,就會生成一個隨機值,並且保存而不是保存任何形式的主密碼。 2000000是我們要運行HMAC的次數,它被存儲並且應該是用戶可選擇的 - 這應該等於你可以忍受的等待的次數(KeePass有一個功能來對它們進行基準測試,看看有多少次需要1秒 - 我建議增加到4或5秒)。 256是所需輸出的位數 - 在這種情況下,我假設您將使用CAMELLIA-256或AES-256來加密您的密碼(只需匹配您的加密功能對密鑰使用的位數) 。 是的,可以使用scrypt或bcrypt。

  2. 檢查主密碼是否正確:如果我們正在使用現有主密碼進入現有數據庫,請使用該內存中密鑰來解密某些固定數據,如「默認」密碼。如果值解密爲您所期望的值,則輸入的主密碼正確,否則主密碼錯誤和/或數據庫已損壞。如果我們正在啓動新數據庫或更改主密碼,請加密該「默認」密碼並存儲加密值。

  3. 使用主加密密鑰來解密URL的用戶名,備註和其他非密碼數據。

  4. 使用主加密密鑰僅根據用戶的請求(但僅限用戶請求的確切密碼)對現有密碼進行解密,然後一旦完成或定時器運行就用隨機垃圾覆蓋數據出。使用所述主加密密鑰加密新密碼。

  5. 一旦用戶完成或定時器用完,用隨機垃圾覆蓋所有變量(尤其是內存中唯一的主加密密鑰)。

注意你存儲:

  • 迭代
  • 數鹽
  • 加密僅用於驗證主密碼是否正確
  • 加密的用戶名 「固定」 的密碼, URL,筆記等
  • 加密個人網站密碼

你永遠不會存儲主密碼或它的散列。您永遠無法比較主密碼,哈希值,甚至是生成的主加密密鑰。您只需掌握主密碼並將其轉換爲主密鑰,然後使用該密鑰對數據進行加密或解密 - 已知數據(「固定」密碼)可讓您查看該密鑰是否提供了預期結果。當您知道主密碼正確時,未知數據(用戶輸入和關注的所有內容)也會被加密或解密。

相關問題