24

我正在開發一個應用程序,用戶需要登錄才能執行操作......但主要是在android手機上使用「保持我登錄狀態」...並且在這種情況下我將不得不在我的應用程序中保留用戶名和密碼的價值..我應該使用首選項還是SQLite Db或者是否有其他內容,如何才能使其安全? plz幫助... 在此先感謝..在Android應用程序中存儲用戶名和密碼的最佳選擇

+0

這工作正常:http://stackoverflow.com/a/19629701/5733853 – HPbyP 2016-11-22 20:14:24

回答

4

最起碼,它存儲在SharedPreferences(私密模式),不要忘了哈希密碼。雖然這不會對惡意用戶(或根源設備)產生影響,但它是某種東西。

+0

任何教程如何散列密碼?我對這個想法很感興趣。沒有人可以使用該技術檢索存儲的密碼? – androniennn 2012-02-10 19:10:03

+1

@androniennn有關於如何哈希密碼教程_ton_所以我會讓你谷歌。有一點需要記住的是散列只是爲了阻止_casual_ snooper。這種技術**在設備植根時(例如)不起作用,並且惡意用戶也可以訪問您的二進制文件。想想看,如果有人能夠對你的程序進行逆向工程,那麼他們可以很容易地弄清楚你如何捨棄密碼。你只需要知道所有的可能:) – 2012-02-10 19:14:13

+0

一個很好的方法/技術,但不是100%肯定和安全的:\ – androniennn 2012-02-11 23:58:16

25

是的,這在Android上很棘手。您不想在首選項中存儲明文密碼,因爲任何擁有紮根設備的人都會基本上向全世界顯示其密碼。另一方面,您不能使用加密的密碼,因爲您必須將加密/解密密鑰存儲在設備的某個位置,這又可能會受到根攻擊。

我以前使用過的一種解決方案是讓服務器生成一個「票據」,並將其傳遞迴設備,這對於一段時間是有利的。這張票被設備用於所有通信,當然使用SSL,這樣人們就不會偷走你的票。這樣,用戶在服務器上驗證其密碼一次,服務器發回過期的故​​障單,並且密碼永遠不會存儲在設備上的任何位置。

幾種三方認證機制,如OpenID,Facebook甚至Google API都使用這種機制。缺點是每隔一段時間,當票證到期時,用戶需要重新登錄。

最終,這取決於您希望應用程序的安全性如何。如果這僅僅是爲了區分用戶,並且沒有超級祕密信息像銀行賬戶或血型一樣被存儲,那麼可能在設備上以明文保存pwd就好了:)

祝你好運,無論你決定什麼方法最適合你的特殊情況!

編輯:我應該注意到,這種技術將安全責任轉移到服務器上 - 你會希望在服務器上使用鹽醃密碼進行密碼比較,你會在其他一些註釋中看到這個想法題。這樣可以防止除了設備上的EditText View,服務器的SSL通信以及服務器的RAM之外的任何地方出現純文本密碼,並且密碼被加密和散列。它永遠不會存儲在磁盤上,這是一件好事(tm)。

+3

我同意你在技術上說的一切。但我覺得你的血型越公開,越有可能在緊急情況下可以挽救;) – 2014-01-30 17:47:44

+2

數據不是超級祕密並不重要,用戶可以在許多地方使用相同的用戶/密碼攻擊者可以獲得這些服務並嘗試不同的服務。 – 2016-10-12 11:30:40

22

正如其他人所說,沒有安全的方式來存儲在Android的密碼,充分保護數據。散列/加密密碼是一個好主意,但它所要做的只是減緩「破解者」。

隨着中說,這是我做的:

1)我用這個simplecryto.java class這需要一個種子和一個文本和加密。 2)我使用私人模式下的SharedPreferences,它保護非根設備中保存的文件。 3)我用於simplecryto的種子是一個比字符串更難找到的字節數組。

我的應用程序最近由我公司聘請的「白帽子」安全組審查。他們標記了這個問題,並表示我應該使用OAUTH,但他們也將其列爲低風險問題,這意味着它不是很好,但不足以阻止發佈。

請記住,「破解者」將需要物理訪問設備,並根據它並謹慎地找到種子。

如果你真的關心安全性,不要有「保持登錄狀態」選項。

+0

教程鏈接已損壞,所以我不確定它是否相同,但Google立即給了我一篇看起來很相似的文章:http://www.androidsnippets.com/encryptdecrypt-strings,但它發生了對我來說,你可以使用一個隨機生成的種子存儲在設備上以增加安全性。這個共享的祕密/種子將是每個用戶隨機生成的,並且脫離設備的存儲將包含該映射。只要您安全地與該位置安全地交換信息,並且該存儲是安全的,那麼效果會不會更好? – batbrat 2014-03-11 09:29:49

+1

@batbrat如果你要有一個服務器端持久用戶狀態,推薦oauth2而不是自己研發的東西。在我的例子中,沒有用戶狀態,所以我沒有任何可用的對象。 – knaak 2014-03-11 19:17:00

+0

謝謝您澄清。我現在明白了,並且同意。 – batbrat 2014-03-11 19:35:06

1

要做到這一點,而不會危害安全的最安全的方法是使用共享偏好存儲的最後一個人的只有用戶名的登錄。

此外,在用戶的表,引入擁有數字列布爾值(1或0)表示檢查人員是否檢查了「記住我」複選框。

啓動應用程序時,使用getSharedPreferences()函數獲取用戶名,並使用它來查詢託管數據庫以查看signedin列是1還是0,其中1表示該人檢查了「記住我」複選框。

1
//encode password 
pass_word_et = (EditText) v.findViewById(R.id.password_et); 
String pwd = pass_word_et.getText().toString(); 
       byte[] data = new byte[0]; 
       try { 
        data = pwd.getBytes("UTF-8"); 
       } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } 
       String base64 = Base64.encodeToString(data, Base64.DEFAULT); 
       hbha_pref_helper.saveStringValue("pass_word", base64); 

//decode password 
String base64=hbha_pref_helper.getStringValue("pass_word"); 
      byte[] data = Base64.decode(base64, Base64.DEFAULT); 
      String decrypt_pwd=""; 
      try { 
       decrypt_pwd = new String(data, "UTF-8"); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
+1

歡迎來到StackOverflow!您是否也可以提供解釋來幫助PO瞭解您的答案? – FrankS101 2016-09-01 11:30:55

+6

Base64不加密,它是編碼算法,非常容易識別和解碼。 – 2016-10-27 12:56:09

0

使用NDK進行加密和解密與定義字符串鍵變了,而不是將其保存在共享偏好或定義它沿着INS字符串XML將有助於防止對大多數腳本小子的密鑰竊取。結果密文將被存儲在共享首選項中。 This link may help about the sample code

相關問題