Files
Password-Manager/server-php/README.md
T
r-zakarya ec4fa433a9 feat(sync): read-only PHP endpoint serving the encrypted snapshot
Alternative to WebDAV, and the base for an Android client. The server never decrypts: it stores and serves opaque bytes, so a compromise yields ciphertext plus size and mtime.

GET only for now, with a strong ETag and If-None-Match; PUT answers 405 explicitly so a client fails loudly rather than believing it wrote. A bad token answers 404 like a missing snapshot, so an unauthenticated caller learns nothing. HTTPS is required - the bearer token rides a header on every call.
2026-08-14 17:41:34 +01:00

1.7 KiB

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

  1. Copier config.example.php en config.php, y mettre un jeton :
    php -r "echo bin2hex(random_bytes(32)), PHP_EOL;"
    
  2. Créer le dossier de données hors racine web et y déposer l'instantané produit par l'application Windows (vault-sync.json).
  3. Servir sync.php en 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 ETag fort.
  • 304 — si le client renvoie If-None-Match avec 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).