Apache commonly strips Authorization before PHP sees it, so every request looked unauthenticated on a stock XAMPP and answered 404. If-None-Match is now compared on the bare hash: a validator that lost its quotes, or a weak W/ tag, would never match and each request would silently re-download the whole snapshot - expensive on mobile data and invisible in the logs, a 200 looking perfectly normal.
Endpoint de synchronisation PHP (lecture seule)
Alternative au WebDAV pour distribuer l'instantané chiffré du coffre. Le serveur ne déchiffre rien : il sert des octets opaques.
Installation
- Copier
config.example.phpenconfig.php, y mettre un jeton :php -r "echo bin2hex(random_bytes(32)), PHP_EOL;" - Créer le dossier de données hors racine web et y déposer l'instantané
produit par l'application Windows (
vault-sync.json). - Servir
sync.phpen HTTPS. Sans TLS, l'endpoint refuse la requête : le jeton circule dans un en-tête à chaque appel.
Utilisation
GET /sync.php
Authorization: Bearer <jeton>
- 200 — le conteneur chiffré, avec un
ETagfort. - 304 — si le client renvoie
If-None-Matchavec l'ETag qu'il détient. - 404 — pas encore d'instantané, ou jeton invalide. Les deux répondent pareil : un appelant non authentifié n'apprend pas si quelque chose existe ici.
- 405 — toute autre méthode. L'écriture viendra avec le client bidirectionnel.
Ce que le serveur voit
Le conteneur est chiffré côté client (PBKDF2-SHA256 600 k + AES-GCM) avec le mot de passe de sync, qui n'est jamais transmis. Un serveur compromis livre donc du chiffré, plus ces métadonnées : la taille du fichier, sa date de modification, et la fréquence des synchronisations.
Le jeton authentifie l'appareil, pas le coffre. Le voler donne accès au chiffré, pas au contenu.
Étape suivante
L'écriture demandera PUT avec If-Match: <etag> — c'est ce qui empêche deux
appareils de s'écraser mutuellement. Le client Windows sait déjà le faire : il
capture l'ETag à la lecture et rejoue le cycle complet sur un 412
(runSyncNow, borné à 3 tentatives).