Armazenar informações críticas utilizando storage inseguro em dispositivos pode ocasionar o roubo de informações.
Cenários Vulneráveis
Imagine que necesitamos armazenar dados críticos (tokens de sessão, credenciais, segredos ou dados pessoais e sensíveis) no storage do aplicativo.
Para isso criamos um repositório para nos apoiar neste gerenciamento:
import 'package:shared_preferences/shared_preferences.dart';
class AuthRepository { Future<void> saveCredentials(String username, String password) async { SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setString('username', username); await prefs.setString('password', password); // Extremely vulnerable! }}Riscos
Ao salvar este tipo de informação no storage comum do aplicativo eles ficam salvos "em texto plano e de forma pública" no dispositivo.
Decorrente disso, corremos os riscos de:
- Qualquer acesso físico ao celular ou malware poderia obter estas informações.
- Em caso de armazenamento incorreto de credenciais ou tokens, será possível roubar a sessão ou segredos do aplicativo.
- Caso estejam armazenados dados pessoais, pode ser categorizado como vazamento de dados.
Como Mitigar
Para armazenar tais informações, devemos utilizar o storage seguro.
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
class AuthRepository { final _storage = const FlutterSecureStorage();
Future<void> saveCredentials(String username, String password) async { await _storage.write(key: 'username', value: username); await _storage.write(key: 'password', value: password); }}Ao utilizar este tipo de armazenamento, outros aplicativos ou pessoas que tiverem acesso físico ao celular não poderão acessar as informações a menos que passem pelo controle biométrico (como faceid, touchid, passcode).
React-Native
Para React-Native, você pode seguir as recomendações escritas na documentação oficial:
React-Native Secure Storage Documentation