Как хранить токены Android? Нужен способ, которым можно нормально хранить токены в приложении. Есть приложение клиент, которое принимает логин-пароль и отправляет его на сервер. Сервер сверяет данные и выдаёт приложению токен. Однако, токен надо как-то хранить, чтобы потом по нему инициализировать пользователя. Вопрос, как это сделать? Shared Preferences? Безопасно ли? Нужно просто куда-то засунуть уже готовый токен и потом его достать при необходимости. Если можно, небольшой пример, спасибо.
Для хранения токенов в Android приложении наиболее безопасным способом является использование Android KeyStore. Он позволяет хранить данные в зашифрованном виде, что делает их недоступными для посторонних приложений или пользователей.
Пример использования Android KeyStore для хранения токенов:
Создайте класс для управления ключами и шифрования данных:import android.content.Context; import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyProperties; import java.security.KeyStore; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; public class TokenManager { private static final String KEY_ALIAS = "TokenAlias"; public static void saveToken(Context context, String token) { try { KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); if (!keyStore.containsAlias(KEY_ALIAS)) { KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); keyGenerator.init(new KeyGenParameterSpec.Builder(KEY_ALIAS, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) .setRandomizedEncryptionRequired(false) .build()); keyGenerator.generateKey(); } Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); cipher.init(Cipher.ENCRYPT_MODE, keyStore.getKey(KEY_ALIAS, null)); byte[] encryptedToken = cipher.doFinal(token.getBytes()); // Сохраняем зашифрованный токен в SharedPreferences или другое место } catch (Exception e) { e.printStackTrace(); } } public static String getToken(Context context) { try { KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); cipher.init(Cipher.DECRYPT_MODE, keyStore.getKey(KEY_ALIAS, null)); // Получаем зашифрованный токен из SharedPreferences или другого места byte[] encryptedToken = ...; byte[] decryptedToken = cipher.doFinal(encryptedToken); return new String(decryptedToken); } catch (Exception e) { e.printStackTrace(); return null; } } }Используйте методы saveToken() и getToken() для сохранения и получения токена в вашем приложении:// Сохранение токена String token = "your_token_here"; TokenManager.saveToken(getApplicationContext(), token); // Получение токена String savedToken = TokenManager.getToken(getApplicationContext());
Таким образом, токен будет храниться в Android KeyStore в зашифрованном виде, обеспечивая безопасность данных.
Для хранения токенов в Android приложении наиболее безопасным способом является использование Android KeyStore. Он позволяет хранить данные в зашифрованном виде, что делает их недоступными для посторонних приложений или пользователей.
Пример использования Android KeyStore для хранения токенов:
Создайте класс для управления ключами и шифрования данных:import android.content.Context;import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
import java.security.KeyStore;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class TokenManager {
private static final String KEY_ALIAS = "TokenAlias";
public static void saveToken(Context context, String token) {
try {
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
if (!keyStore.containsAlias(KEY_ALIAS)) {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
keyGenerator.init(new KeyGenParameterSpec.Builder(KEY_ALIAS, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.setRandomizedEncryptionRequired(false)
.build());
keyGenerator.generateKey();
}
Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7);
cipher.init(Cipher.ENCRYPT_MODE, keyStore.getKey(KEY_ALIAS, null));
byte[] encryptedToken = cipher.doFinal(token.getBytes());
// Сохраняем зашифрованный токен в SharedPreferences или другое место
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getToken(Context context) {
try {
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7);
cipher.init(Cipher.DECRYPT_MODE, keyStore.getKey(KEY_ALIAS, null));
// Получаем зашифрованный токен из SharedPreferences или другого места
byte[] encryptedToken = ...;
byte[] decryptedToken = cipher.doFinal(encryptedToken);
return new String(decryptedToken);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}Используйте методы saveToken() и getToken() для сохранения и получения токена в вашем приложении:// Сохранение токена
String token = "your_token_here";
TokenManager.saveToken(getApplicationContext(), token);
// Получение токена
String savedToken = TokenManager.getToken(getApplicationContext());
Таким образом, токен будет храниться в Android KeyStore в зашифрованном виде, обеспечивая безопасность данных.