docs(android): the cache chain is verified on device

Write with no prompt, read under the device credential, cache surviving a cold start with no derivation, and a silent 304. Records the three traps that hid behind it, none of which the compiler could see.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-15 14:28:58 +01:00
parent c4d2bdde73
commit f3a8631440
2 changed files with 80 additions and 1 deletions
+39 -1
View File
@@ -57,7 +57,43 @@ retéléchargé, pas rester illisible. C'est l'autre branche de la même garde.
---
## 1 bis. La décision qui bloque le cache (constatée le 2026-08-15)
## 1 bis. ~~La décision qui bloque le cache~~ — RÉSOLU le 2026-08-15
Mesuré sur appareil (schéma d'écran, aucune empreinte enrôlée) :
```
cache ecrit - protege par biometrie/code (aucune invite à l'écriture)
--- redémarrage à froid, saisie du schéma ---
4 entrees, 2 en corbeille (aucune ligne « dechiffre en … ms »)
HTTP 304 en 136 ms
304 : inchange, coffre deja ouvert
```
Les points §1.1, §1.2, §1.3 et §1.5 sont donc validés d'un coup : clé créée sous
authentification, ouverture par schéma, cache survivant à un démarrage à froid
sans dérivation, et rafraîchissement de fond silencieux.
**Trois pièges se cachaient derrière, aucun visible à la compilation** :
1. `USE_BIOMETRIC` absente de la liste par défaut de Delphi — et
`CanAuthenticate` lève au lieu de répondre `False`.
2. FMX n'affiche pas l'invite depuis notre activité : il lance
`BiometricFragmentActivity`, qui doit être déclarée au manifeste.
3. **Le digest du MGF1.** `setDigests()` n'autorise que celui du message ;
celui du MGF1 est une autorisation distincte dont le défaut est SHA-1.
Le chiffrement passait quand même — la clé publique reconstruite est servie
par le fournisseur logiciel, qui accepte n'importe quel MGF1 — et produisait
un chiffré valide que le matériel refusait de lire. Le symptôme
n'apparaissait qu'au lancement suivant.
Ce qui reste de §1 : l'expiration de la fenêtre de 30 s (le cache doit
survivre — il le fera, `LoadVault` n'efface plus jamais) et l'enrôlement d'une
nouvelle empreinte, qui invalide la clé pour de bon.
<details>
<summary>Le diagnostic d'origine, conservé pour la trace</summary>
## La décision qui bloquait le cache
Le cache ne s'écrit presque jamais. Journal sur appareil :
@@ -94,6 +130,8 @@ jamais.
Retenir la 1. Les deux autres échangent une propriété de sécurité contre du
confort, ce qui est le mauvais sens pour un gestionnaire de mots de passe.
</details>
## 2. Durcissement — petit, à faire avant tout usage réel
Par ordre de gravité, pas de taille.