Как хранить токены Android? Нужен способ, которым можно нормально хранить токены в приложении.
Есть приложение клиент, которое принимает логин-пароль и отправляет его на сервер.
Сервер сверяет данные и выдаёт приложению токен.
Однако, токен надо как-то хранить, чтобы потом по нему инициализировать пользователя.
Вопрос, как это сделать? Shared Preferences? Безопасно ли?
Нужно просто куда-то засунуть уже готовый токен и потом его достать при необходимости.
Если можно, небольшой пример, спасибо.

21 Авг 2019 в 06:30
275 +1
0
Ответы
1

Для хранения токенов в 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 в зашифрованном виде, обеспечивая безопасность данных.

20 Апр 2024 в 13:17
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир