Projet personnel, développement mobile

CipherWorks

Le projet en bref

Contexte
Projet personnel d’application Android, développé avec Flutter et Dart.
Mon rôle
Développement des outils réunis dans CipherWorks : chiffrement, gestion d’identifiants et codes temporaires.
Livrable consultable
Extraits Dart commentés et archive des quatre extraits.
Résultat et limites
Le code permet d’examiner des fonctions précises. Il ne constitue pas un audit de sécurité complet ; la disponibilité actuelle sur Google Play reste non confirmée.

Difficulté technique

Un code TOTP dépend du secret, de l’horodatage et des paramètres du compte. Une période ou un nombre de chiffres incohérent peut produire un code différent de celui attendu.

L’extrait présenté conserve ces paramètres dans TotpEntry et les transmet à la bibliothèque otp. Les valeurs par défaut sont de six chiffres pour une période de 30 secondes. Cette séparation rend le calcul lisible et ses paramètres explicites.

La génération des mots de passe utilise Random.secure(). Le contrôle de saisie, lui, vérifie une règle de formulaire : il faut examiner ces deux fonctions séparément pour comprendre leur portée.

Une application Android qui rassemble plusieurs outils de cybersécurité dans une interface mobile, développée avec Flutter et Dart.

Les fonctionnalités

  • Chiffrement et déchiffrement de données.
  • Gestion d’identifiants et génération de mots de passe.
  • Codes de double authentification (TOTP).
  • Filigrane sur les photos.
  • Analyse du réseau et flux d’actualités de sécurité.
FlutterDartAndroidCybersécurité

L’application en images

Visuels de présentation conservés de CipherWorks.

Fonctionnement documenté par le code

Génération des mots de passe

La fonction _generatePassword produit 18 caractères par défaut. Elle utilise Random.secure() et tire chaque caractère dans un alphabet défini. La longueur peut être passée en paramètre.

Lire la fonction Dart

lib/vault_screen.dart, lignes 109 à 117.

  String _generatePassword({int length = 18}) {
    const chars =
        'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#%^*()-_=+[]{}';
    final rand = Random.secure();
    return List.generate(
      length,
      (_) => chars[rand.nextInt(chars.length)],
    ).join();
  }

Contrôle de la saisie

Avant le chiffrement, la saisie est contrôlée : au moins 12 caractères, une lettre, un chiffre et un symbole. Ce contrôle est une règle de formulaire.

Lire le contrôle de saisie

lib/encryption_screen.dart, lignes 292 à 297.

  bool validatePassword(String password) {
    return password.length >= 12 &&
        RegExp(r'[A-Za-z]').hasMatch(password) &&
        RegExp(r'[0-9]').hasMatch(password) &&
        RegExp(r'[!@#$%^&*(),.?":{}|<>]').hasMatch(password);
  }

Codes temporaires TOTP

Le modèle TotpEntry conserve les paramètres du compte. Par défaut, il prévoit six chiffres et une période de 30 secondes. Le calcul du code est confié à la bibliothèque otp, à partir du secret et de l’horodatage.

  1. Lire les paramètres du compte
  2. Calculer le code temporaire
  3. Actualiser l’affichage
Lire l’appel au calcul TOTP

lib/totp_screen.dart, lignes 118 à 131.

  String _currentCode(TotpEntry entry) {
    try {
      return OTP.generateTOTPCodeString(
        entry.secret,
        _now,
        length: entry.digits,
        interval: entry.period,
        algorithm: entry.algorithm,
        isGoogle: true,
      );
    } catch (_) {
      return '-----';
    }
  }

Télécharger les quatre extraits Dart

Origine des éléments présentés

Les extraits proviennent des fichiers du projet Flutter. Ils sont fournis comme fragments de code à lire. Les visuels de présentation proviennent des ressources de l’ancienne fiche Google Play.

Fichiers, lignes et sources des visuels