🔓Flutter Secure Storage

Este código implementa funcionalidades básicas de autenticação, incluindo armazenamento seguro do token de autenticação usando FlutterSecureStorage e criptografia do token para garantir sua segurança.

  • authenticated(): Método estático que verifica se o usuário está autenticado, retornando um valor booleano.

  • logout(): Método estático que realiza o logout do usuário, excluindo o token de autenticação armazenado.

  • saveToken(String token): Método estático que recebe um token de autenticação e o armazena de forma criptografada no FlutterSecureStorage.

  • getToken(): Método estático que retorna o token de autenticação descriptografado, se estiver presente no FlutterSecureStorage.

  • _decrypt(String encrypted): Método privado que descriptografa uma string criptografada usando a chave e o vetor de inicialização especificados.

  • _encrypt(String value): Método privado que criptografa uma string usando a chave e o vetor de inicialização especificados.

import 'dart:async';
import 'dart:convert';
import 'package:encrypt/encrypt.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

class Authentication {
  static const _storage = FlutterSecureStorage();
  static const _tokenKey = "authentication_token";
  static const _encryptionKey = ""; //secure-random -l 16
  static const _iv = ""; //secure-random -l 16

  // Verifica se o usuário está autenticado
  static Future<bool> authenticated() async {
    final token = await _getToken();
    return token != null;
  }

  // Realiza o logout do usuário
  static Future<void> logout() async {
    await _storage.delete(key: _tokenKey);
  }

  // Salva o token de autenticação criptografado
  static Future<void> saveToken(String token) async {
    final encryptedToken = _encrypt(token);
    await _storage.write(key: _tokenKey, value: encryptedToken);
  }

  // Obtém o token de autenticação descriptografado
  static Future<String?> getToken() async {
    final encryptedToken = await _storage.read(key: _tokenKey);
    if (encryptedToken == null) {
      return null;
    }
    return _decrypt(encryptedToken);
  }

  // Método privado para obter o token de autenticação descriptografado
  static Future<String?> _getToken() async {
    final encryptedToken = await _storage.read(key: _tokenKey);
    if (encryptedToken == null) {
      return null;
    }
    return _decrypt(encryptedToken);
  }

  // Descriptografa uma string criptografada
  static String _decrypt(String encrypted) {
    final key = Key.fromUtf8(_encryptionKey);
    final iv = IV.fromUtf8(_iv);
    final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
    final decrypted =
        encrypter.decrypt(Encrypted.fromBase64(encrypted), iv: iv);
    return decrypted;
  }

  // Criptografa uma string
  static String _encrypt(String value) {
    final key = Key.fromUtf8(_encryptionKey);
    final iv = IV.fromUtf8(_iv);
    final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
    final encrypted = encrypter.encrypt(value, iv: iv);
    return base64.encode(encrypted.bytes);
  }
}

Last updated