Sécurité QR Codes
La solution de cashback nouvelle génération
INTRODUCTION
1.1 Contexte et Objectifs
Le QR Code est un élément central du système de cashback commerçant REWAPP. Il permet aux utilisateurs de dépenser leurs points directement chez les partenaires avec un ratio avantageux (10 points = 1,05€, soit +5% par rapport au cashback bancaire).
La sécurité du QR Code est critique car il représente :
- Une valeur monétaire réelle (points convertibles)
- Un vecteur d'échange entre utilisateur et commerçant
- Un élément exposé à des risques de fraude
1.2 Règles Métier Fondamentales
RÈGLES ABSOLUES DU QR CODE
Ces règles sont immuables et constituent le socle de sécurité du système.
Paramètres de Sécurité
| Paramètre | Valeur | Justification |
|---|---|---|
Validité temporelle |
60 secondes | Limiter la fenêtre d'exploitation |
Usage |
UNIQUE | Empêcher la réutilisation frauduleuse |
Montant minimum |
10 points | Éviter les micro-transactions coûteuses |
Signature |
HMAC-SHA256 | Standard cryptographique robuste |
Blocage points |
Immédiat | Garantir la disponibilité des fonds |
1.3 Menaces Identifiées
Les principales menaces ciblant le système QR Code sont :
Matrice des Menaces
| Menace | Description | Niveau de Risque |
|---|---|---|
| Capture et réutilisation | Screenshot du QR et tentative de double dépense | CRITIQUE |
| Falsification | Génération de QR codes frauduleux | CRITIQUE |
| Interception | Man-in-the-middle lors du scan | ÉLEVÉ |
| Bruteforce | Tentative de génération massive de QR | ÉLEVÉ |
| Usurpation d'identité | Utilisation du compte d'un tiers | MOYEN |
| Exploitation temporelle | Abus de la fenêtre de 60 secondes | MOYEN |
ARCHITECTURE DE SÉCURITÉ QR CODE
2.1 Vue d'Ensemble
L'architecture de sécurité QR Code repose sur 4 couches de protection :
- Couche 1 - Authentification : Vérification de l'identité de l'utilisateur
- Couche 2 - Génération : Création sécurisée avec signature cryptographique
- Couche 3 - Validation : Contrôles multiples lors du scan
- Couche 4 - Audit : Traçabilité complète de toutes les opérations
2.2 Flux de Sécurité Complet
Étapes du Flux Sécurisé
| Étape | Action | Contrôle de Sécurité |
|---|---|---|
| 1 | Utilisateur authentifié dans l'app | JWT valide + session active |
| 2 | Demande de génération QR | Vérification solde suffisant |
| 3 | Blocage des points | Transaction atomique en base |
| 4 | Génération QR avec signature | HMAC-SHA256 + UUID unique |
| 5 | Affichage QR avec compteur | Timer 60 secondes côté client |
| 6 | Scan par commerçant | Vérification signature + expiration |
| 7 | Validation serveur | Contrôle usage unique + intégrité |
| 8 | Débit des points | Transaction irréversible |
| 9 | Confirmation | Notifications aux deux parties |
2.3 Composants de Sécurité
Stack Technique
| Composant | Technologie | Rôle |
|---|---|---|
| Serveur de génération | Node.js + NestJS |
Création et signature des QR codes |
| Base de données | PostgreSQL |
Stockage des métadonnées QR |
| Cache Redis | Redis 7+ |
Gestion des expirations temps réel |
| API Gateway | Kong / AWS API Gateway |
Rate limiting et filtrage |
| Service de validation | Microservice dédié |
Vérification lors du scan |
GÉNÉRATION SÉCURISÉE DU QR CODE
3.1 Structure du Payload QR Code
Le QR Code contient un payload JSON signé avec les éléments suivants :
Structure du Payload
| Champ | Type | Description | Exemple |
|---|---|---|---|
qr_id |
UUID v4 |
Identifiant unique du QR code | 550e8400-e29b... |
user_id |
String (crypté) |
Identifiant utilisateur chiffré | enc_U3x8K... |
points |
Integer |
Montant en points | 200 |
value_eur |
Decimal |
Valeur en euros (points × 0,105) | 21.00 |
timestamp |
ISO 8601 |
Date/heure de génération | 2025-11-24T14:30:00Z |
expires_at |
ISO 8601 |
Date/heure d'expiration | 2025-11-24T14:31:00Z |
nonce |
String |
Valeur aléatoire anti-replay | a7f3b2c1d4e5 |
signature |
String |
HMAC-SHA256 du payload | 9f86d081884c7d6... |
3.2 Algorithme de Signature HMAC-SHA256
PROCESSUS DE SIGNATURE
La signature garantit l'authenticité et l'intégrité du QR code.
Étape 1 : Construction de la chaîne à signer
Format : qr_id|user_id|points|timestamp|expires_at|nonce
Étape 2 : Calcul du HMAC
Algorithme : HMAC-SHA256
Clé secrète : Clé de 256 bits stockée dans Variables CapRover
Rotation : Clé renouvelée tous les 90 jours
Étape 3 : Encodage final
Payload JSON encodé en Base64
QR Code généré au format PNG (300×300 pixels)
3.3 Sécurisation de la Clé de Signature
Mesures de Protection
| Mesure | Implémentation |
|---|---|
| Stockage | Variables CapRover (chiffré AES-256) |
| Accès | IAM roles restrictifs |
| Rotation | Automatique tous les 90 jours |
| Backup | Multi-région (eu-west-1 + eu-central-1) |
| Audit | CloudTrail pour tous les accès |
3.4 Génération du UUID
- Algorithme : UUID v4 (128 bits aléatoires)
- Source d'entropie :
crypto.randomUUID()(Node.js) - Unicité garantie : 2^122 combinaisons possibles
- Indexation : Index unique en base de données
3.5 Blocage Atomique des Points
RÈGLE CRITIQUE
Les points DOIVENT être bloqués AVANT la génération du QR code.
Transaction Atomique
| Étape | Action | Rollback en cas d'erreur |
|---|---|---|
| 1 | BEGIN TRANSACTION |
- |
| 2 | SELECT points FROM wallet FOR UPDATE |
ROLLBACK |
| 3 | Vérification solde ≥ montant demandé | ROLLBACK si insuffisant |
| 4 | UPDATE wallet SET blocked_points += montant |
ROLLBACK |
| 5 | INSERT INTO qr_codes (statut = 'PENDING') |
ROLLBACK |
| 6 | COMMIT |
- |
La transaction atomique garantit qu'aucun point n'est doublement engagé.
VALIDATION ET VÉRIFICATION
4.1 Processus de Validation au Scan
Lors du scan par le commerçant, le système effectue 7 vérifications obligatoires :
Contrôles de Validation
| Contrôle | Description | Erreur si Échec |
|---|---|---|
| 1. Décodage | Lecture et parsing du QR code | QR_INVALID_FORMAT |
| 2. Signature | Vérification HMAC-SHA256 | QR_SIGNATURE_INVALID |
| 3. Expiration | Contrôle timestamp < 60 secondes | QR_EXPIRED |
| 4. Usage unique | Vérification statut ≠ USED | QR_ALREADY_USED |
| 5. Utilisateur | Compte actif et non suspendu | USER_SUSPENDED |
| 6. Commerçant | Partenaire validé et actif | MERCHANT_INVALID |
| 7. Solde | Points bloqués toujours disponibles | INSUFFICIENT_POINTS |
4.2 Codes d'Erreur de Validation
Messages d'Erreur
| Code | Message Utilisateur | Message Commerçant | Action |
|---|---|---|---|
QR_INVALID_FORMAT |
QR code invalide | Format QR non reconnu | Demander régénération |
QR_SIGNATURE_INVALID |
QR code non authentique | Signature invalide - fraude possible | Alerte sécurité |
QR_EXPIRED |
QR code expiré | Code expiré (> 60s) | Demander régénération |
QR_ALREADY_USED |
Ce QR a déjà été utilisé | Tentative de réutilisation | Refuser + log |
USER_SUSPENDED |
Compte temporairement suspendu | Utilisateur bloqué | Contacter support |
MERCHANT_INVALID |
- | Compte partenaire non valide | Vérifier statut |
INSUFFICIENT_POINTS |
Solde insuffisant | Points insuffisants | Vérifier solde |
4.3 Vérification Anti-Replay
Le système anti-replay empêche toute réutilisation d'un QR code :
Mécanismes Anti-Replay
| Mécanisme | Implémentation |
|---|---|
| Nonce unique | Valeur aléatoire incluse dans chaque QR |
| Cache Redis | Stockage des nonces utilisés (TTL 24h) |
| Statut en base | Champ status : PENDING → USED → EXPIRED |
| Timestamp serveur | Comparaison avec horloge NTP synchronisée |
4.4 Gestion de l'Expiration
CYCLE DE VIE DU QR CODE (60 SECONDES)
Le QR code suit un cycle de vie strict avec des indicateurs visuels pour l'utilisateur.
Zone verte - Scan normal
Compteur vert affiché à l'utilisateur
Validation standard
Zone orange - Avertissement
Compteur orange
Message "Dépêchez-vous !"
Zone rouge - Critique
Compteur rouge clignotant
Message "Expiration imminente"
Expiré
QR code grisé
Points automatiquement débloqués
Statut → EXPIRED
PROTECTION CONTRE LA FRAUDE
5.1 Rate Limiting sur la Génération
Limites de Génération
| Limite | Valeur | Fenêtre | Action si Dépassé |
|---|---|---|---|
| Par utilisateur | 5 QR codes | 5 minutes | Blocage temporaire 15 min |
| Par utilisateur | 20 QR codes | 1 heure | Alerte + vérification manuelle |
| Par utilisateur | 50 QR codes | 24 heures | Suspension compte |
| Global système | 10 000 QR codes | 1 minute | Alerte ops + scaling auto |
5.2 Détection d'Anomalies
Le système analyse en temps réel les patterns suspects :
Patterns Suspects
| Anomalie | Détection | Action |
|---|---|---|
| Génération rapide successive | > 3 QR en 1 minute | Alerte niveau 1 |
| QR non utilisés répétés | > 5 expirations consécutives | Vérification utilisateur |
| Montants inhabituels | Écart > 3σ de la moyenne utilisateur | Flag pour revue |
| Localisation incohérente | IP/GPS différent du pattern | 2FA supplémentaire |
| Horaire atypique | Activité hors plage habituelle | Score de risque augmenté |
5.3 Scoring de Risque
Chaque génération de QR code est associée à un score de risque (0-100) :
Niveaux de Risque
| Score | Niveau | Action |
|---|---|---|
| 0-30 | FAIBLE | Génération normale |
| 31-50 | MODÉRÉ | Logging détaillé |
| 51-70 | ÉLEVÉ | Vérification 2FA requise |
| 71-85 | TRÈS ÉLEVÉ | Validation manuelle admin |
| 86-100 | CRITIQUE | Blocage automatique |
5.4 Blacklist des Codes Compromis
En cas de compromission détectée :
- Révocation immédiate : Le QR code est marqué REVOKED en base
- Notification : Alerte push à l'utilisateur concerné
- Blocage préventif : Tous les QR en cours du compte sont invalidés
- Investigation : Ticket automatique créé pour l'équipe sécurité
5.5 Protection contre le Screenshot
Mesures anti-capture d'écran :
FLAG_SECUREsur Android (empêche les screenshots)UIScreen.capturedDidChangeNotificationsur iOS (détection)- Watermark invisible avec timestamp dans le QR
- Validation du
device_idlors du scan
AUDIT ET TRAÇABILITÉ
6.1 Événements Audités
Journal des Événements
| Événement | Données Enregistrées | Rétention |
|---|---|---|
QR_GENERATED |
user_id, qr_id, points, timestamp, ip, device | 3 ans |
QR_SCANNED |
qr_id, merchant_id, timestamp, result, duration | 3 ans |
QR_EXPIRED |
qr_id, reason, timestamp | 1 an |
QR_VALIDATION_FAILED |
qr_id, error_code, merchant_id, timestamp | 3 ans |
QR_REVOKED |
qr_id, reason, admin_id, timestamp | 5 ans |
FRAUD_DETECTED |
user_id, qr_id, fraud_type, score, timestamp | 5 ans |
6.2 Structure des Logs
Format standardisé JSON pour tous les logs QR :
{
"event_type": "QR_SCANNED",
"timestamp": "2025-11-24T14:30:45.123Z",
"qr_id": "550e8400-e29b-41d4-a716-446655440000",
"user_id": "usr_12345",
"merchant_id": "mrc_67890",
"points": 200,
"result": "SUCCESS",
"latency_ms": 145,
"ip_address": "192.168.1.100",
"device_fingerprint": "abc123def456",
"risk_score": 15
}
6.3 Monitoring en Temps Réel
Métriques et Alertes
| Métrique | Seuil d'Alerte | Criticité |
|---|---|---|
| Taux d'échec validation | > 5% sur 5 min | HAUTE |
| Latence scan > 500ms | > 10% des requêtes | MOYENNE |
| QR expirés / générés | > 30% sur 1h | MOYENNE |
| Tentatives réutilisation | > 10 sur 1h | CRITIQUE |
| Signatures invalides | > 1 sur 1h | CRITIQUE |
GESTION DES INCIDENTS DE SÉCURITÉ
7.1 Classification des Incidents
Niveaux de Priorité
| Niveau | Description | Exemples | Temps de Réponse |
|---|---|---|---|
| P1 - CRITIQUE | Compromission système | Fuite clé secrète, fraude massive | < 15 minutes |
| P2 - MAJEUR | Vulnérabilité exploitée | Contournement validation | < 1 heure |
| P3 - MODÉRÉ | Anomalies détectées | Pattern suspect | < 4 heures |
| P4 - MINEUR | Incident isolé | Tentative de fraude unique | < 24 heures |
7.2 Procédure de Réponse P1 (Critique)
PROCÉDURE D'URGENCE - INCIDENT CRITIQUE
Cette procédure doit être suivie immédiatement en cas d'incident P1.
Étape 1 (0-5 min) : Containment
Désactivation immédiate de la génération QR (feature flag)
Notification équipe sécurité (PagerDuty)
Étape 2 (5-15 min) : Assessment
Identification de la portée de l'incident
Évaluation du nombre d'utilisateurs impactés
Étape 3 (15-30 min) : Mitigation
Rotation de la clé de signature si compromise
Révocation de tous les QR en cours si nécessaire
Communication aux utilisateurs impactés
Étape 4 (30 min+) : Recovery
Correction de la vulnérabilité
Réactivation progressive du service
Post-mortem sous 48h
7.3 Révocation de Masse
En cas de compromission majeure, procédure de révocation :
Actions de Révocation
| Action | Commande | Impact |
|---|---|---|
| Révoquer tous les QR pending | UPDATE qr_codes SET status='REVOKED' WHERE status='PENDING' |
Déblocage des points |
| Rotation clé signature | Rotation manuelle via CapRover | Nouveaux QR uniquement |
| Invalidation cache | FLUSHDB sur Redis QR |
Rechargement depuis DB |
| Notification utilisateurs | Push + Email batch | Information transparente |
7.4 Communication de Crise
Plan de Communication
| Audience | Canal | Délai | Contenu |
|---|---|---|---|
| Utilisateurs impactés | Push + Email | < 1h | Incident + actions utilisateur |
| Tous utilisateurs | App (banner) | < 2h | Statut service |
| Commerçants | Dashboard + Email | < 1h | Instructions opérationnelles |
| Régulateur (CNIL) | Email officiel | < 72h si données personnelles | Rapport détaillé |
CONFORMITÉ ET STANDARDS
8.1 Standards Cryptographiques
Standards Appliqués
| Composant | Standard | Conformité |
|---|---|---|
| Signature QR | HMAC-SHA256 |
NIST FIPS 198-1 |
| Chiffrement user_id | AES-256-GCM |
NIST FIPS 197 |
| Génération UUID | RFC 4122 v4 |
IETF |
| Transport | TLS 1.3 |
RFC 8446 |
| Stockage clés | AWS KMS |
FIPS 140-2 Level 3 |
8.2 Conformité RGPD
Le QR Code contient des données personnelles (user_id) :
Exigences RGPD
| Exigence RGPD | Implémentation |
|---|---|
| Minimisation | Seules les données nécessaires dans le QR |
| Pseudonymisation | user_id chiffré (non lisible en clair) |
| Durée de conservation | QR codes supprimés après 90 jours |
| Droit à l'effacement | Suppression des QR lors de la clôture compte |
| Portabilité | Export possible des transactions QR |
8.3 Exigences PCI DSS (Indirectes)
Bien que le QR Code ne contienne pas de données bancaires :
Application PCI DSS
| Exigence | Application QR Code |
|---|---|
| Segmentation réseau | Service QR isolé des services bancaires |
| Chiffrement transit | TLS 1.3 obligatoire |
| Logs d'audit | Conservation 1 an minimum |
| Tests de sécurité | Pentest annuel incluant le flux QR |
RÉCAPITULATIF DES MESURES DE SÉCURITÉ
9.1 Tableau de Synthèse
État des Mesures de Sécurité
| Catégorie | Mesure | Statut |
|---|---|---|
| Authentification | JWT + session active requise | Implémenté |
| Signature | HMAC-SHA256 avec clé 256 bits | Implémenté |
| Expiration | 60 secondes strictes | Implémenté |
| Usage unique | Vérification en base + cache | Implémenté |
| Rate limiting | 5 QR / 5 min par utilisateur | Implémenté |
| Détection fraude | Scoring + patterns | Implémenté |
| Audit | Logs complets 3 ans | Implémenté |
| Anti-replay | Nonce + cache Redis | Implémenté |
| Rotation clés | Automatique 90 jours | Implémenté |
| Monitoring | Alertes temps réel | Implémenté |
9.2 Checklist Sécurité QR Code
CONFORMITÉ COMPLÈTE
Toutes les mesures de sécurité critiques sont implémentées et opérationnelles.
- Signature HMAC-SHA256 vérifiée
- Expiration 60 secondes respectée
- Usage unique garanti (PENDING → USED)
- Points bloqués atomiquement
- Rate limiting en place
- Détection d'anomalies active
- Logs d'audit complets
- Procédures d'incident documentées
- Conformité RGPD assurée
- Tests de sécurité réguliers