Étude de cas · Authentificateur Aegis

Comment fonctionne un authentificateur
générer un code de connexion?

Un code à six chiffres change toutes les 30 secondes. Utilisez REA pour trouver le calcul dans un Android APK , puis reconstruisez-le avec une horloge que vous pouvez contrôler.

Aegis 3.4.3 · Android * Version officielle APK · 6,9 Mo

Voir le modèle Aegis sur le modèle GitHub

D'un APK à un code que vous pouvez reproduire

  1. 01 * Localisez la fonctionnalité3 077 classes → méthodes de génération REA recherche le package et trace le code utilisé par les actions d'affichage et de copie.
  2. 02 * Lire le calculHeure + clé de compte → six chiffres REA renvoie les méthodes et les valeurs par défaut. L'agent explique comment ils s'emboîtent.
  3. 03 * Reconstruire et vérifierChange l'horloge. Regarde le code.Une nouvelle démo de navigateur reproduit la règle et la compare à des cas de référence publics.

Demandez à votre agent

L'application affiche un code de connexion changeant. Nous voulons trouver ce qui le fait changer et reproduisez ce comportement.

Votre agent de codage

Analyse aegis-v3.4.3.apk avec REA. Explique comment le code de connexion à six chiffres est généré et pourquoi il change toutes les 30 secondes. Crée une petite démo où je peux modifier l’heure.

Un exemple d'invite pour le APK téléchargé, avec l'analyse Android de REA configurée. Obtenez le APK et la configuration de l'analyse ↓

Essayez le générateur de code

L'application regroupe le temps en blocs de 30 secondes. Il combine le numéro de bloc avec la clé de compte pour générer un code. La même clé et le même bloc produisent le même code.

Déplacez l'horloge sur 60 secondes

  1. Temps59 secondesNotre horloge d'exemple réglable
  2. bloc de 30 secondesBloquer 1floor(59 / 30)
    30-59 secondes
  3. Code généré287082Clé de compte + bloc → six chiffres

À 59 secondes: 287082. À 60 secondes: 359152. Le déplacement à l'intérieur d'un bloc laisse le code inchangé.

La clé est fixe, publique Données de test RFC 6238. La démo implémente le calcul récupéré à partir du APK .

Trouver le code avec REA

  1. Limitez le APK à trois classes

    Agent → REA
    inspect_android_package
    {"path": "aegis-v3.4.3.apk"}
    
    search_android_classes
    {"path": "aegis-v3.4.3.apk",
     "query": "Totp"}
    REA → agent · résultats sélectionnés
    Package: com.beemdevelopment.aegis
    Version: 3.4.3
    Classes: 3,077
    
    Three matches:
      otp.TotpInfo
      ui.views.TotpProgressBar
      importers.TotpAuthenticatorImporter

    TotpInfo est le calcul candidat; les deux autres concernent la barre de progression et les comptes importés. TOTP signifie un mot de passe à usage unique basé sur le temps.

  2. Connectez le générateur à l'écran de l'application

    Agent → REA
    inspect_android_class
    {"path": "aegis-v3.4.3.apk",
     "class_name":
      "com.beemdevelopment.aegis.otp.TotpInfo"}
    
    trace_android_references
    {"path": "aegis-v3.4.3.apk",
     "class_name":
      "com.beemdevelopment.aegis.otp.OtpInfo",
     "method_name": "getOtp"}
    REA → méthodes et appelants de l'agent ·
    TotpInfo methods:
      getOtp()      · overload 0
      getOtp(long)  · overload 1
    
    OtpInfo.getOtp callers:
      ui.views.EntryHolder.getOtp
      ui.MainActivity.copyEntryCode

    REA identifie la surcharge d'horodatage et trouve les appelants de la méthode de base. Inspection EntryHolder.getOtp puis affiche l'appel d'affichage TotpInfo.getOtp(timestamp).

Les requêtes affichent un chemin d'entrée raccourci. Les noms de classe de résultat omettent le commun com.beemdevelopment.aegis préfixe.

Lire le calcul

Retours sur le REA la conversion d'horloge, les paramètres par défaut et les méthodes de génération. Les constructeurs définissent un intervalle de 30 secondes et six chiffres; la méthode d'horodatage transforme les secondes en un numéro de bloc.

REA * Java décompilé sélectionné
// TotpInfo defaults and clock
setPeriod(30);
getOtp(System.currentTimeMillis() / 1000);

// OtpInfo default algorithm and digits
this(bArr, "SHA1", 6);

// Block passed to the generator
(long) Math.floor(j / ((double) this._period))

// generateOTP → getHash
byte[] hash = getHash(bArr, str, j);

// getHash: account key + encoded block
Mac mac = Mac.getInstance(str);
mac.init(secretKeySpec);
return mac.doFinal(bArrArray);

// OTP.toString, case 0
this._code % ((int) Math.pow(10.0d, i))

// Keep leading zeroes
while (sb.length() < i) {
    sb.insert(0, "0");
}
Résumé lisible * interprétation de l'agent
// Group time into 30-second blocks
seconds = current_time_ms / 1000
block = floor(seconds / 30)

// Generate a number from the key and block
hash = HMAC_SHA1(account_key,
                 big_endian_8_bytes(block))
number = select_31_bits(hash)

// Format the default six-digit code
code = number % 1_000_000
code = pad_with_zeroes(code, 6)

Le temps choisit le bloc. Les secondes 30 à 59 donnent toutes le bloc 1. À 60 secondes, le bloc devient 2.

La clé compte aussi. Le générateur combine la clé de compte avec le bloc. Un compte avec une clé différente peut afficher un code différent en même temps.

Gardez six chiffres. Le reste après division par 1 000 000 est complété par des zéros si nécessaire, de sorte qu'un code peut commencer par 0.

Extraits de plusieurs méthodes inspectées, avec retour à la ligne pour l'affichage. Le panneau de droite est un résumé explicatif. Le code Aegis est sous licence GPL-3.0.

À l'intérieur du générateur

Les mises APK publiées generateOTP dans kotlin.ExceptionsKt. REA suit l'appel de TotpInfo et renvoie ce corps; la source d'origine appelle l'assistant HOTP.

REA * Générez OTP, corps complet
public static OTP generateOTP(byte[] bArr, String str,
        int i, long j)
        throws NoSuchAlgorithmException, InvalidKeyException {
    byte[] hash = getHash(bArr, str, j);
    int i2 = hash[hash.length - 1] & 15;
    return new OTP(
        (hash[i2 + 3] & 255)
        | ((hash[i2] & 127) << 24)
        | ((hash[i2 + 1] & 255) << 16)
        | ((hash[i2 + 2] & 255) << 8), i, 0);
}

Le dernier octet de hachage sélectionne une position. Quatre octets à cette position fournissent un nombre positif de 31 bits; le formatage le réduit au nombre de chiffres demandé. Le dernier argument du constructeur sélectionne la branche de formatage de code introduite par la compilation.

Comparer avec la source de publication correspondante.

Vérifiez la reconstruction

Nous avons assemblé les méthodes Java REA sélectionnées dans un petit programme de test. Leur sortie correspondait à une reconstruction indépendante sur 133 cas de test, y compris les limites des blocs de temps et les codes commençant par zéro.

Exemple de temps Bloquer Code à six chiffres
30 secondes 1 287082
59 secondes 1 287082
60 secondes 2 359152
1 111 111 109 secondes 37,037,036 081804

Le générateur correspond également aux six cas de référence SHA-1 publiés dans Référence RFC 6238. Vérifiez l'implémentation du navigateur par rapport à eux:

Lire le calcul de la démo

Les cas de référence utilisent huit chiffres. La vérification vérifie également leurs résultats à six chiffres.

La vérification exécute les méthodes Java extraites et la nouvelle démo. L'Android APK a été inspecté statiquement.

Inspectez vous-même le APK

Mettre en place REA sur macOS ou Linux, puis téléchargez ces deux fichiers dans le même dossier. Sur Windows, utilisez un Linux environnement tel que WSL.

L'analyse Android nécessite un JDK 17 complet ou une version ultérieure. Sélectionnez-le avec JAVA_HOME ou PATH. Cette affaire utilisait JDK 21.

Pointez REA sur le fichier fournisseur et inspectez le APK :

Modèle: macOS / Linux
REA_JADX_MCP_JAR="$PWD/jadx-headless-mcp-0.7.1-all.jar" \
npx rea-agents@latest inspect-android-package \
  ./aegis-v3.4.3.apk --format json --full-output

Votre agent peut continuer via le REA de CLI en utilisant l'invite ci-dessus. Pour le modèle MCP, ajoutez REA_JADX_MCP_JAR à l'environnement du serveur REA et reconnectez-le.

Une question suivante: que se passe-t-il lorsqu'un compte utilise huit chiffres ou un intervalle de temps différent?

Sources

Inspecté avec REA 6.1.0 le 9 octobre 2026. Les extraits décompilés sont crédités à Aegis ; le diagramme, le résumé lisible et la reconstruction du navigateur sont de nouveaux supports pédagogiques.

Haut