Skip to main content

Guide d'Anonymisation des Données - Portail Clients

Vue d'ensemble

Ce document détaille la stratégie d'anonymisation des données pour les environnements de développement et de qualification du Portail Clients. L'objectif est de protéger les données personnelles tout en préservant la cohérence fonctionnelle de l'application pour les tests et le développement.

Configuration

Activation de l'anonymisation

L'anonymisation est contrôlée par la section DataAnonymization dans les fichiers appsettings.json :

{
"DataAnonymization": {
"Enabled": false,
"Environment": "Production",
"RandomSeed": 12345,
"Rules": {
"AnonymizePersonalInfo": false,
"AnonymizeAddresses": false,
"AnonymizePhoneNumbers": false,
"AnonymizeEmails": false,
"AnonymizeNumeroTiers": false,
"AnonymizeRid": false,
"PreserveRelationships": true,
"PreserveAmounts": true
}
}
}

Paramètres principaux

ParamètreTypeValeur par défautDescription
EnabledboolfalseActive/désactive l'anonymisation
Environmentstring"Production"Environnement actuel (Development, Staging, Production)
RandomSeedint12345Graine pour la reproductibilité des données anonymisées

Règles d'anonymisation

RègleTypeValeur par défautDescription
AnonymizePersonalInfobooltrueAnonymise prénom, nom, nom d'usage
AnonymizeAddressesbooltrueAnonymise les adresses de facturation et postale
AnonymizePhoneNumbersbooltrueAnonymise les numéros de téléphone
AnonymizeEmailsbooltrueAnonymise les adresses email
AnonymizeNumeroTiersboolfalseAnonymise les numéros de tiers
AnonymizeRidbooltrueAnonymise les numéros RID
PreserveRelationshipsbooltruePréserve les relations entre entités
PreserveAmountsboolfalsePréserve les montants financiers

Données anonymisées

Comptes Salesforce (SalesforceAccountDto)

Informations personnelles

  • FirstName : Prénom généré via Bogus (locale française)
  • LastName : Nom de famille généré via Bogus (locale française)
  • Name : Nom complet reconstruit à partir du prénom et nom anonymisés
  • Autres_Prenoms__c : Autres prénoms générés aléatoirement (30% de probabilité)
  • Nom_d_usage_ou_marital__c : Nom marital généré aléatoirement (20% de probabilité)

Coordonnées

  • Email__c : Format user{hash8}@anonymous.local
  • TelephoneMobile__c : Format téléphone Nouvelle-Calédonie 687XXXXXX TODO: Retirer le prefix 687.

Adresses

  • BillingAddress et ShippingAddress :
    • Street : Numéro aléatoire (1-999) + rue depuis la liste prédéfinie
    • City : Ville depuis la liste des villes de Nouvelle-Calédonie
    • PostalCode : "98800" (fixe)
    • State : Région depuis la liste des régions NC
    • Country : "Nouvelle-Calédonie" (fixe)

Identifiants métier

  • RID__c : Numéro à 8 chiffres (10000000-99999999)
  • Numero_de_tiers__c : Format TIERS_{ENVIRONMENT}_{hash6}

Montants financiers

  • Nombre_global_de_parts_sociales__c : Valeur aléatoire (0-1000) si PreserveAmounts = false

Opportunités Salesforce (SalesforceOpportunityDto)

  • Name : Format "Opportunité anonymisée {hash8}"
  • Capital_initial__c : Montant aléatoire (1000-100000) si PreserveAmounts = false

Comptes à vue

Contrats

  • Libelle
  • NumeroCompteWithClefRib

Opérations

  • DateOperation
  • DateValeur
  • Intitule
  • IntituleComplet
  • Beneficiaire

Sources des données de remplacement

Bibliothèque Bogus

Le système utilise la bibliothèque Bogus avec la locale française ("fr") pour générer :

  • Prénoms et noms de famille réalistes
  • Données cohérentes grâce aux seeds reproductibles

Données en dur - Nouvelle-Calédonie

Rues de Nouméa (16 rues)

"Rue de la Paix", "Avenue du Maréchal Foch", "Rue Sébastopol", 
"Avenue de la Victoire", "Rue Georges Clemenceau", "Avenue Paul Doumer",
"Rue du Général Mangin", "Route de l'Anse Vata", "Rue de Rivoli",
"Avenue des Frères Carcopino", "Rue de Verdun", "Avenue Jean Jaurès",
"Rue Anatole France", "Boulevard Vauban", "Rue Gambetta",
"Avenue de la République"

Villes de Nouvelle-Calédonie (16 villes)

"Nouméa", "Mont-Dore", "Dumbéa", "Païta", "Bourail", "La Foa", 
"Koné", "Voh", "Pouembout", "Poya", "Houaïlou", "Ponérihouen",
"Touho", "Poindimié", "Koumac", "Kaala-Gomen"

Régions de Nouvelle-Calédonie (3 régions)

"Sud", "Nord", "Îles Loyauté"

Algorithmes de génération

Hash SHA256

  • Utilisé pour générer des identifiants cohérents et reproductibles
  • Combiné avec le RandomSeed de configuration
  • Garantit la même anonymisation pour le même ID Salesforce

Seeds reproductibles

  • Conversion du hash SHA256 en seed numérique
  • Combinaison avec le RandomSeed global
  • Assure la cohérence entre les sessions d'application

Logique d'activation

L'anonymisation est activée uniquement si :

  1. Enabled = true dans la configuration
  2. ET l'environnement est "Development" OU "Staging"

En production, l'anonymisation est automatiquement désactivée même si Enabled = true.

Préservation des données

Données toujours préservées

  • ID Salesforce : Identifiant unique conservé pour les relations
  • RecordType : Type d'enregistrement conservé
  • Dates NPAI : Dates de constat NPAI conservées
  • Données métier : Numéros de projet, étapes, dates de clôture

Données conditionnellement préservées

  • Relations : Attaché commercial conservé si PreserveRelationships = true
  • Montants : Parts sociales et capitaux conservés si PreserveAmounts = true
  • Valeurs null : Les champs null en entrée restent null après anonymisation

Utilisation dans le code

L'anonymisation est appliquée automatiquement dans le service UserAccountProcessingService avant la création ou synchronisation des utilisateurs :

// Anonymisation des données Salesforce avant création de l'utilisateur
var anonymizedAccount = _anonymizationService.AnonymizeAccount(account);
var (userId, password) = await _userManagement.CreateUserAsync(anonymizedAccount, role);

Exemples de transformation

Exemple d'anonymisation d'un compte

Données originales :

{
"Id": "0013X00000ABC123",
"FirstName": "Jean",
"LastName": "Dupont",
"Email__c": "[email protected]",
"TelephoneMobile__c": "687123456",
"BillingAddress": {
"Street": "123 Rue Réelle",
"City": "Nouméa",
"PostalCode": "98800",
"Country": "Nouvelle-Calédonie"
}
}

Données anonymisées :

{
"Id": "0013X00000ABC123",
"FirstName": "Pierre",
"LastName": "Martin",
"Email__c": "[email protected]",
"TelephoneMobile__c": "687654321",
"BillingAddress": {
"Street": "456 Avenue du Maréchal Foch",
"City": "Mont-Dore",
"PostalCode": "98800",
"Country": "Nouvelle-Calédonie"
}
}

Architecture technique

Classes principales

  • SalesforceDataAnonymizationService : Service principal d'anonymisation
  • AnonymizationOptions : Configuration des règles d'anonymisation
  • AnonymizationRules : Règles spécifiques par type de données

Interfaces

  • ISalesforceDataAnonymizationService : Interface du service d'anonymisation

Fichiers de configuration

  • appsettings.json : Configuration par défaut (Production)
  • appsettings.Development.json : Configuration spécifique au développement
  • appsettings.Staging.json : Configuration spécifique au staging

Bonnes pratiques

  1. Ne jamais activer l'anonymisation en production
  2. Utiliser des seeds cohérents pour faciliter les tests
  3. Préserver les relations critiques pour maintenir l'intégrité fonctionnelle
  4. Tester régulièrement que l'anonymisation fonctionne correctement
  5. Documenter les changements de configuration d'anonymisation

Sécurité et conformité

  • Les données anonymisées ne permettent pas de remonter aux données originales
  • Respect des principes RGPD pour les environnements de développement
  • Utilisation de hash SHA256 pour garantir la sécurité cryptographique
  • Préservation de la cohérence des données pour les tests fonctionnels

Cette approche garantit que les données sensibles ne sont jamais stockées dans la base de données locale lors des environnements de développement et de test.