2013-02-15 64 views
6

我有一個關於核心數據加密的問題。我將一些敏感的用戶數據存儲在Core Data SQLite數據庫中。臨界值都是可變換的,我正在使用AES256對它們進行加密和解密,包括每個值的個人IV。加密密鑰是用戶選擇的密碼的SHA512散列。迄今爲止這工作得很好。核心數據加密

現在關於用戶密碼。當用戶啓動應用程序時,他被要求輸入密碼。密碼正在使用SHA512散列並存儲在iOS鑰匙串中。對於每個寫入或讀取操作,NSValueTransformer將從鑰匙串中獲取密碼。如果應用程序正在關閉,我將從密鑰鏈中刪除密碼哈希。

在我的核心數據庫中,我有一個特殊的實體,它有一個隨機數!= 0,因爲它只是一個值。要測試用戶是否輸入了正確的密碼,我獲取該實體並閱讀該編號。如果是=! 0,我知道密碼是正確的,因爲當解密失敗時,NSValueTransformer總是返回0.

現在我的實際問題:你認爲這是一個好的加密方法嗎?如果輸入的密碼正確,你還會測試其他什麼?

我有點擔心,在應用程序運行時將密碼哈希存儲在鑰匙串中會讓所有事情變得更慢,因爲NSValueTransformer必須始終訪問鑰匙串。將密碼散列保存在內存中是否足夠安全,所以在應用程序關閉時它會被刪除?

回答

7

你不應該使用密碼的散列,散列被設計得很快,所以它(相對)很容易做一個暴力攻擊。使用key derivation function,如PBKDF2

請勿使用直接從密碼派生的密鑰作爲加密密鑰。如果用戶更改密碼,則需要重新加密所有數據,備份變得毫無價值。使用隨機生成的加密密鑰,使用基於密碼的密鑰加密密鑰進行加密。

我不太確定將哈希存儲在鑰匙串中,而不是將其保存在內存中。上次我研究這一點時,解密鑰匙鏈是比較容易的。而且每個可以讀取正在運行的應用程序的內存的攻擊者很可能會窺探鑰匙串訪問或解密的數據。只要將它保存在內存中,並確保在應用程序掛起到背景等時擦除內存。對於每個解密數據,這顯然也是正確的。

[編輯:@JeffLockhart澄清一個主加密密鑰的程序] 你生成一個隨機密鑰對數據進行加密,讓我們稱之爲關鍵答:您可以使用SecRandomCopyBytes生成密鑰A,看到Apple's CryptoExcercise針對使用例。您使用密鑰A來加密用戶數據。要保存密鑰A,必須使用第二個密鑰B加密密鑰A.由於快速暴力或字典攻擊,您不應直接將密碼用作密鑰B.所以你從一個PBKDF的密碼派生出一個密鑰,就像在this stackoverflow的答案。然後你用密鑰B加密密鑰A,例如使用CCCrypt。您保存加密密鑰A和用於派生密鑰B的鹽。 要解密,用戶輸入密碼,您使用密碼和salt來派生密鑰B.您使用派生的密鑰B解密密鑰A.希望澄清。

+0

你能說明你的意思嗎?「使用隨密鑰加密的隨機生成的加密密鑰和基於密碼的密鑰加密密鑰?」我正在尋找加密我的核心數據存儲的一些字段,並且正在尋找一個生成用於執行加密的密鑰的最佳實踐。我同意以密碼爲基礎是沒有道理的,因爲它可以改變。 – 2013-04-23 05:35:41

1

你可以看看這個:

Secure Incremental Store

他們實現其使用加密的SQLite數據庫內一個NSIncrementalStore子類。這是Apple SQLite Store的替代品。還帶有價格標籤。

+1

「帶有價格標籤」 - 你不是在開玩笑! – kball 2013-05-03 19:35:12