2015-05-30 44 views
1

我在這裏有一個有趣的情況。我的應用程序存儲用戶輸入的敏感信息,例如他們的社交服務帳戶。我使用用戶輸入的主密碼來生成一個SecretKey,然後使用AES加密並將其SHA1散列和加密數據存儲在設備上,而不是主密碼本身或密鑰。當密鑰不再可訪問時,解密用SecretKey加密的字符串

問題是,如果用戶忘記密碼,他們可以回答並更改主密碼。所以當主通道改變時,由於先前的密碼(和相關的密鑰)永遠消失了,我不能解密存儲的字符串並向用戶顯示解密的數據。

這裏是我能想到的解決方案:

1 - 保管密碼,這是我所聽到的完全不安全。

2 - 存儲SecretKey,但我聽說這也是不安全的。

3 - 將用戶數據存儲在未加密的數據庫中,這是不安全的。

4 - 每當用戶忘記密碼時擦除整個數據庫,這是我認爲的愚蠢。

我需要一種方法來克服這一點,我根本無法想到一個安全的方式來拉它。 這對我的應用程序飛行來說至關重要。任何和所有的幫助真的很感激。

+2

1.正確。 2.正確。 3.正確。不,這是正確的答案。根據定義,其他一切都是後門。鼓勵用戶安全地使用密碼,以免他們忘記密碼。 – CommonsWare

+0

那麼僅僅因爲他們忘記密碼而刪除所有用戶的數據有點不公平。我的應用程序包含他們的信用卡,社交媒體帳戶和一些個人筆記。將它們刪除將是一場災難。如果用戶完全依賴這個應用程序來保存它們。 是否有任何其他方式來解密數據?或者製作和以前一樣的SecretKey?! –

回答

1

那麼僅僅因爲他們忘記密碼而刪除所有用戶的數據有點不公平。

然後他們不應該將東西存儲在需要密碼的容器中。接下來,你會爭辯說,任何人都應該能夠使用曲棍球票和一些口香糖打開任何牆壁安全,因爲有人可能會忘記鎖的組合。

請注意,您的調查線假設您在開篇中描述的方法是構建具有您所需安全特性的應用程序的正確方法。

例如,滿足您要求的正確答案是根本不加密數據,而是強制用戶將其設備全盤加密。您可以使用DevicePolicyManager來查看設備是否啓用了全磁盤加密,如果設備沒有啓用,則可以拒絕運行。然後,數據就會像其他設備一樣進行加密,但您不再需要處理密碼短語和恢復方案—,這取決於Google和設備製造商。

是否有任何其他方式來解密數據?

僅當您的應用程序(a.k.a.,後門)存在漏洞時才適用。這是票據存根和口香糖的情況。加密數據的目的在於使其無法在沒有密碼或等效安全密鑰的情況下進行加密。

所以,你的應用程序的另一種方法是轉儲所有關鍵的東西,並使用KeyStore。尤其在具有硬件支持的設備KeyStore的設備上,沒有辦法真正獲得鑰匙,並且無法解鎖設備。在這裏,您不必擔心全磁盤加密(因爲您正在加密數據),而且您也不必擔心用戶忘記了密鑰(因爲用戶從不擁有密鑰)。它還可以節省您不得不讓用戶輸入密碼。但是現在您無法輕鬆地備份數據(因爲沒有密鑰就無用),並且如果用戶的設備被面包店卡車或其他方式毀壞,數據就會消失。你可以爲用戶備份自己的密鑰(例如,可移動介質)提供的選項,但現在你是在他們記住他們存儲在備份,存儲備份密鑰安全地依賴等

或做與之前一樣的SecretKey?

由於沒有人知道你是如何創建這個的,除了你以外沒人能回答你的問題。

我還建議您閱讀this paper,因爲它概述了他們調查的88%的Android應用程序,試圖拼湊他們自己的加密方法的Android應用程序如何搞砸了它。

+0

感謝您的徹底回覆。 –