2012-10-01 52 views
0

我有一些SharedPreferences,我想盡可能安全地保存在設備上。我對安全性一無所知,但我從一些研究中發現,我想要的是一種叫做「混淆器」的東西。是對的嗎?這與「加密」有什麼不同?還是我想要這樣做?我還發現我可以使用AESObfuscatorProGuard。有什麼區別?還有更多選擇嗎?我應該使用哪個?如何在Android設備上安全地保存SharedPreference?

我顯然對安全性很陌生,所以任何教程或其他參考都會有所幫助。

+0

你存儲什麼值,你爲什麼要保護它們? –

+0

一對情侶串和一對長串。沒什麼太複雜的。因爲它們是訪問密鑰,並且我沒有服務器來存儲它們,所以我必須將它們存儲在本地。 – Kalina

回答

2

的鏈接AESObfuscator使用靜態密鑰加密字符串,以便將它們保存到共享首選項,並且它們不是立即顯而易見的。這與代碼混淆器(如ProGuard)不同,後者會在代碼中損壞方法和變量名稱,從而難以進行反向工程。它被稱爲'混淆',而不是'加密',因爲密鑰在應用程序中,而且很容易反轉(通過提取密鑰和解密)。共享的首選項混淆會使讀取和修改字符串變得更加困難,但並非不可能。如果你對這種保護水平沒有問題,請使用這種方法。使用代碼混淆也是一個好主意,所以你想使用兩者。

解密字符串的唯一支持方式是讓用戶在每次使用應用程序時都輸入密碼並從中獲取加密密鑰。這是有效的,但不用說,用戶不太友好。如果你有興趣,這裏有some details

+0

我想我會試着去AESObfuscator。我是否需要整個許可證庫,或者我可以只使用PreferenceObfuscator類? – Kalina

+1

不是全部,而是相關的類,比如'Security'等,IIRC。檢查它引用的類,並將它們添加到您的項目中,直到編譯器很快樂。 –

0

當我需要在Java文件中「隱藏」一些URL時,我對此問題做了一些研究。在你的情況下,它將是某種祕密密鑰來加密你的字符串。任何使用某種逆向工程的人都可以閱讀Java/Android中的整個代碼。有時候這很容易,像ProGuard這樣的混淆器會讓它變得更難一些。所以你的加密密鑰對任何人都是可見的。有些(付費)混淆器可以隱藏Java文件中的字符串,但我不確定它們有多堅實。
簡而言之 - 將字符串保存在服務器的設備外部,並在設備和服務器(SSL)之間使用某種安全連接。或者你可以讓你的服務器把它加密併發回給你。如果將密鑰保存在設備上,則無法確定是否有人使用逆向工程來讀取它。

+0

謝謝,但我具體詢問在設備上保存SharedPreference。我沒有服務器。 – Kalina

+0

我知道,但在這種情況下,它不會100%保護。 – Warlock

4

在這種情況下,混淆器不會爲你做任何事情,因爲它實質上是將變量重命名爲非人類可讀的名稱。

你想要做的是加密數據,因爲它被保存到你的SharedPreferences並且當你從它們讀取它時將它解密。

這個想法的一個例子Encrypted SharedPrefs,我不能說它是多麼有效,我以前沒有用過。

+0

鏈接的'AESObfuscator'實際上用靜態密鑰加密字符串,以便它們可以保存到共享的首選項。這與ProGuard等_code_混淆器不同。它被稱爲'混淆',而不是'加密',因爲密鑰在應用程序中,並且很容易反轉(通過解密)。 –

+1

@ jug6ernaut我找到了你的文章,並決定在鏈接中使用加密的共享首選項。這是非常容易實施和易於使用。至於加密的強度,我不知道,但所有的文本都是亂碼,如果你走進去,並嘗試改變根植手機上的值。 –

0

唯一可靠的方法就是不要在設備上保留任何敏感信息 - 如果它存在,它將被提取,只要它的價值超過某人的工作時間(而第三世界國家的熟練孩子是真的很便宜,在金錢和時間上豐富)。你可以看看這是如何使用OAuth做 - 這種技術允許登錄第三方應用程序(例如)不影響安全性的憑證(或應用程序曾經看到他們)

一個很好的庫嘰嘰喳喳:http://code.google.com/p/oauth-signpost/

+0

謝謝,但我在詢問如何將數據存儲在設備上。我知道這並不安全,但我想盡可能保證安全。 – Kalina

+0

訪問密鑰的使用場景是什麼?如果它們用於識別用戶,則可以使用單向散列對它們進行加密,並使用它來識別用戶 - 這樣可以在有物理訪問磁盤驅動器時像每個unix系統一樣獲得合理的安全性。如果這些密鑰用於識別您的應用程序到其他應用程序,那麼OAuth將是最安全的解決方案,您仍然可以控制並可以撤消對某些應用程序甚至設備的訪問 –

相關問題