我正在製作一個應用程序,要求在加載主應用程序之前輸入密碼。我計劃讓用戶在第一次運行應用程序時創建密碼,然後將密碼存儲在本地設備上,並使用本地對稱密鑰(將在應用程序第一次運行時生成)對其進行加密。這是因爲有人不能簡單地讀取存儲密碼的文件。存儲用於離線使用的對稱密鑰
如何儲存安全使用的鑰匙?還是有更好的方法來隱藏存儲的密碼以用於本地驗證?
該應用程序是專爲離線使用,所以我不能添加任何網絡功能。
我正在製作一個應用程序,要求在加載主應用程序之前輸入密碼。我計劃讓用戶在第一次運行應用程序時創建密碼,然後將密碼存儲在本地設備上,並使用本地對稱密鑰(將在應用程序第一次運行時生成)對其進行加密。這是因爲有人不能簡單地讀取存儲密碼的文件。存儲用於離線使用的對稱密鑰
如何儲存安全使用的鑰匙?還是有更好的方法來隱藏存儲的密碼以用於本地驗證?
該應用程序是專爲離線使用,所以我不能添加任何網絡功能。
您可以在私人模式下使用SharedPreferences來存儲密碼。只要電話不是固定的,但是您可以使用加密技術來存儲密碼。我在本地存儲密碼的方法是在存儲時向密碼添加SALT。 你可以閱讀更多關於它here
對密碼安全的方式 - 哈希。由於密碼在散列過程中丟失,所以散列永遠無法解密。我使用MD5哈希處理下面的代碼 -
public String StringToMD5(String s) {
try {
// Create MD5 Hash
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(s.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i=0; i<messageDigest.length; i++)
M hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
使用此代碼以哈希密碼,然後保存它使用Private SharedPreferences
。當用戶再次輸入密碼時,再次對其進行散列並檢查它是否與之前的散列相同。如果哈希匹配,則授予訪問權限。
請閱讀托馬斯Pornin的canonical answer to How to securely hash passwords?開始。
PBKDF2選項在問題PBKDF2 function in Android列出,但包括天然SecretKeyFactory方法以及Spongycastle,BouncyCastle的,rtner.de等
龍,加密隨機每個密碼鹽是必需的(騰出空間爲未來的發展增加一個以上的密碼!)。
永遠不要問PBKDF2更多的密鑰長度比本機功能支持更多 - PBKDF2-HMAC-SHA-512爲64字節,PBKDF2-HMAC-SHA-1爲20字節。
始終使用盡可能高的迭代計數爲您的用戶能夠忍受。即使對於android設備,對於自己設備上的單個用戶,在應用程序啓動時僅執行一次,對於PBKDF2-HMAC-SHA-1,成千上萬或更多,對於PBKDF2-HMAC-SHA,成千上萬或更多-512。
注意PBKDF2的主要用途是創建加密密鑰 - 您可以使用相同的密碼輸入的爲您生成加密使用AES文件(而不是在ECB模式)的加密密鑰;只是使用不同的鹽和不同數量的迭代。如果你只是這樣做,那麼你甚至不需要密碼哈希;只需嘗試使用生成的密鑰和存儲的迭代次數來解密文件 - 如果有效,那就是正確的密碼。如果失敗,那不是。
Downvoted由於單次通過(從不使用只是單次通過),MD5(不要使用MD5),和一個缺鹽(不要使用無鹽密碼)。 –