| Composant | Implémentation | Statut |
|---|---|---|
| Chiffrement | AES-256-GCM (AEAD) | ✓ Optimal |
| KDF principal | Argon2id (time=3, mem=64 MB, hashLen=32) | ✓ Optimal |
| KDF fallback | PBKDF2-SHA256, 300 000 itérations | ✓ Acceptable |
| IV | 96 bits, crypto.getRandomValues | ✓ Conforme |
| Clé URL | 256 bits aléatoires (32 octets) | ✓ Fort |
| API crypto | Web Crypto API native — pas de lib tierce | ✓ Recommandé |
| AAD | { v:"2.0", alg:"AES-256-GCM", ttl:X } | ✓ Anti-replay |
| Taille originale | Taille après padding | Note |
|---|---|---|
| 0 – 1 Ko | Normalisé à 1 Ko | Taille réelle masquée |
| 1 – 10 Ko | Normalisé à 10 Ko | Taille réelle masquée |
| > 10 Ko | +512 octets de bruit | Taille encore inférable |
| Header | Valeur | Statut |
|---|---|---|
| HSTS | max-age=63072000; includeSubDomains; preload | ✓ Optimal (2 ans) |
| Content-Security-Policy | default-src 'none' + nonce | ⚠ Voir findings |
| X-Frame-Options | DENY | ✓ Anti-clickjacking |
| X-Content-Type-Options | nosniff | ✓ Anti-MIME sniffing |
| Referrer-Policy | no-referrer | ✓ Aucune fuite URL |
| Permissions-Policy | Caméra, micro, géo… tout désactivé | ✓ Minimal |
| Server | Apache (version non masquée) | ⚠ Mineur |
Le nonce mc/Bz4z+4JUOrK0qg14qkA== semble identique à chaque réponse HTTP.
Un nonce CSP doit être régénéré à chaque requête — s'il est statique, il ne protège de rien contre le XSS car un attaquant peut le réutiliser.
crypto.js et jszip.min.js sont chargés sans attribut integrity=.
Si le serveur est compromis, un attaquant peut injecter du JavaScript malveillant sans que le navigateur le détecte.
Pour les contenus supérieurs à 10 Ko, seuls 512 octets de bruit sont ajoutés. La taille réelle reste largement inférable par un observateur réseau, ce qui contredit partiellement l'objectif anti-analyse de trafic.
Le header Server: Apache révèle le type de serveur. Sans ServerTokens Prod dans la config Apache, la version complète peut être exposée — information utile pour cibler des CVE connues.
L'appel btoa(String.fromCharCode.apply(null, array)) dans padContent() peut lever une exception Maximum call stack size exceeded sur de gros fichiers. Non critique en prod avec les paliers actuels, mais fragile.