В первой части начнем с фундамента: хранения данных и аутентификации. Именно здесь чаще всего закладываются уязвимости, которые потом сложно исправить.
1. Не храните данные в открытом виде
Сохранение токенов в
SharedPreferences — прямой путь к компрометации:
final prefs = await SharedPreferences.getInstance();
prefs.setString("token", token);
Используйте зашифрованное хранилище:
final secureStorage = FlutterSecureStorage();
await secureStorage.write(
key: "access_token",
value: token,
);
final token = await secureStorage.read(key: "access_token");
2. Только token-based аутентификация
Cookies и сессии не подходят для банковских приложений. Токен должен добавляться ко всем запросам централизованно:
class AuthInterceptor extends Interceptor {
final FlutterSecureStorage storage;
AuthInterceptor(this.storage);
@override
void onRequest(RequestOptions options, handler) async {
final token = await storage.read(key: "access_token");
if (token != null) {
options.headers["Authorization"] = "Bearer $token";
}
handler.next(options);
}
}
3. Никогда не хардкодьте личные данные
API-ключи и токены не должны попадать в репозиторий:
const apiKey = "sk_test_123456";
Правильно:
const apiKey = String.fromEnvironment("API_KEY");
Передача через CI:
--dart-define=API_KEY=your_key_here
А что происходит, когда аутентификация уже выстроена, но трафик можно перехватить, а OTP проверяется на клиенте?
В следующей части разберем сетевую безопасность, SSL pinning и работу с OTP⚙️
