v1.0 Novembre 2025
6.6

Sécurité QR Codes

La solution de cashback nouvelle génération

24 novembre 2025
Version 1.0
Sécurité & Conformité
1

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
2

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
Couche 2 Génération
Couche 3 Validation
Couche 4 Audit
  • 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
3

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é.

4

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.

0-45
Zone verte - Scan normal

Compteur vert affiché à l'utilisateur
Validation standard

Seconde 0-45
45-55
Zone orange - Avertissement

Compteur orange
Message "Dépêchez-vous !"

Seconde 45-55
55-60
Zone rouge - Critique

Compteur rouge clignotant
Message "Expiration imminente"

Seconde 55-60
60+
Expiré

QR code grisé
Points automatiquement débloqués
Statut → EXPIRED

5

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_SECURE sur Android (empêche les screenshots)
  • UIScreen.capturedDidChangeNotification sur iOS (détection)
  • Watermark invisible avec timestamp dans le QR
  • Validation du device_id lors du scan
6

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 :

JSON
{
  "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
7

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)

2
Étape 2 (5-15 min) : Assessment

Identification de la portée de l'incident
Évaluation du nombre d'utilisateurs impactés

3
É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

4
É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é
8

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
9

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