Skip to content

Insecure Data Storage

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

Referências