2014-01-17 77 views
4

我剛剛注意到這個article關於一個以明文存儲用戶信息的移動應用程序。我已經注意到將用戶密碼存儲在服務器上的想法(使用SHA-512散列函數),但我不清楚在設備本身存儲個人信息的最佳方法。在iOS設備上安全存儲個人用戶數據

讓我明確我基本上只談論用戶名和密碼。我的應用程序與之交互的數據一點都不敏感,而且我知道我可以對該數據實施某種對稱加密/解密。

爲了方便用戶,我想爲用戶提供一個選項,以便在本地存儲他們的用戶名和密碼,這樣他們在每次使用應用程序時都不需要輸入它。但我知道用戶傾向於重複使用相同的密碼以實現多種用途,這意味着我需要採取預防措施以保護我的用戶密碼安全。經典的方便和安全之間的緊張關係

在本地存儲這些信息只是一個可怕的想法嗎?還是有相對簡單的手段來安全地加密這個? iOS和Android操作系統是否提供這方面的幫助?

沒有必要尋找詳盡的答案,但我真的很感謝一些研究課題,文章鏈接,書籍等。非常感謝。如果這是一個多餘的問題,請將我引導至任何提供仍被認爲是最新的答案的帖子。

非常感謝!

回答

2

使用設備ID作爲密鑰,設備上的所有數據都會在一定程度上被設備自動加密。這樣可以防止數據輕易被設備本身以外的任何設備讀取,或者無論如何都可以通過設備ID進行讀取。

還有另一個層次的加密可以利用密碼,稱爲數據保護,它可以防止數據被讀取,除非輸入密碼。

您可以使用NSFileManager訪問文件並將NSFileProtectionKey屬性設置爲NSFileProtectionComplete,從而在您的應用中手動啓用數據保護。參見:Implementing and Testing iOS data protection

請注意,用戶必須將其設備設置爲需要密碼,且密碼越強,數據的安全性越高。

即使您不使用帶有NSFileProtectionComplete的NSFileManager類,您也可以通過您的應用程序的供應配置文件輕鬆啓用數據保護。見:Data Protection/NSFileProtectionComplete - successfully supported through entitlements.plist?

我仍然不會存儲密碼。存儲一個隨機生成的會話密鑰,它們在登錄時創建。至少您可以過期這些會話密鑰,它不是純文本密碼。

0

只是從一年前的這篇文章的後續。我決定做的是生成一個隨機會話密鑰(類似於@馬庫斯亞當斯的建議),但將該值用作鹽。然後我將該會話密鑰與用戶選擇的明文密碼連接起來,並將該值存儲在設備上(如果用戶選擇存儲密碼)。一世。即,該裝置存儲該值:

device_hash = SHA256(device_salt ||明文)

即散列值然後變爲我越過HTTP發送到服務器以進行驗證的字符串。在服務器端,我在那裏存儲了不同的鹽值。當服務器接收到設備哈希值時,它有自己的鹽值,並將其連接到該字符串,然後執行自己的哈希。最後的散列是存儲在服務器數據庫中的密碼。即,服務器存儲這個字符串:

server_hash = SHA256(server_salt || device_hash))

我認爲這是安全性和便利性之間建立可行的平衡,特別是因爲我只是想保護密碼,而不是試圖加密在正常應用程序中交換的實際數據。如果用戶的設備遭到入侵,攻擊者不能使用彩虹桌或類似的東西來對密碼進行逆向工程,因爲它是鹽漬的。如果有人真正有動力,SHA256和長長的密碼應該會消除暴力攻擊。

好奇,如果有人有任何批評這種方法。

+0

爲什麼不使用PBKDF2而不是sha256(device_salt || plaintext)。另外可以使用校準函數'CCCalibratePBKDF'來獲得回合的數量。另外HMAC是一個更好的選擇,而不僅僅是將鹽與明文和哈希連接起來。 – zaph