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

46 lines
1.7 KiB
Markdown

# 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 :
```bash
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).