feat: Implémentation authentification NIST SP 800-63B v3.0.8
- Ajout du service PasswordSecurityService conforme NIST SP 800-63B - Vérification des mots de passe contre la base Have I Been Pwned - Validation : minimum 8 caractères, maximum 64 caractères - Pas d'exigences de composition obligatoires (conforme NIST) - Intégration dans LoginController et UserController - Génération de mots de passe sécurisés non compromis 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -8,8 +8,9 @@
|
||||
4. [Architecture des composants](#architecture-des-composants)
|
||||
5. [Base de données](#base-de-données)
|
||||
6. [Sécurité](#sécurité)
|
||||
7. [Endpoints API](#endpoints-api)
|
||||
8. [Changements récents](#changements-récents)
|
||||
7. [Gestion des mots de passe (NIST SP 800-63B)](#gestion-des-mots-de-passe-nist-sp-800-63b)
|
||||
8. [Endpoints API](#endpoints-api)
|
||||
9. [Changements récents](#changements-récents)
|
||||
|
||||
## Structure du projet
|
||||
|
||||
@@ -189,6 +190,211 @@ ADD INDEX `idx_encrypted_user_name` (`encrypted_user_name`);
|
||||
- Chiffrement AES-256 des données sensibles
|
||||
- Envoi séparé des identifiants par email
|
||||
|
||||
## Gestion des mots de passe (NIST SP 800-63B)
|
||||
|
||||
### Vue d'ensemble
|
||||
|
||||
L'API implémente un système de gestion des mots de passe conforme aux recommandations NIST SP 800-63B, avec quelques adaptations spécifiques demandées par le client.
|
||||
|
||||
### Service PasswordSecurityService
|
||||
|
||||
Le service `PasswordSecurityService` (`src/Services/PasswordSecurityService.php`) gère :
|
||||
- Validation des mots de passe selon NIST
|
||||
- Vérification contre les bases de données de mots de passe compromis (HIBP)
|
||||
- Génération de mots de passe sécurisés
|
||||
- Estimation de la force des mots de passe
|
||||
|
||||
### Conformités NIST respectées
|
||||
|
||||
| Recommandation NIST | Notre Implémentation | Status |
|
||||
|-------------------|---------------------|--------|
|
||||
| **Longueur minimale : 8 caractères** | ✅ MIN = 8 caractères | ✅ CONFORME |
|
||||
| **Longueur maximale : 64 caractères minimum** | ✅ MAX = 64 caractères | ✅ CONFORME |
|
||||
| **Accepter TOUS les caractères ASCII imprimables** | ✅ Aucune restriction sur les caractères | ✅ CONFORME |
|
||||
| **Accepter les espaces** | ✅ Espaces acceptés (début, milieu, fin) | ✅ CONFORME |
|
||||
| **Accepter Unicode (émojis, accents, etc.)** | ✅ Support UTF-8 avec `mb_strlen()` | ✅ CONFORME |
|
||||
| **Vérifier contre les mots de passe compromis** | ✅ API Have I Been Pwned avec k-anonymity | ✅ CONFORME |
|
||||
| **Pas d'obligation de composition** | ✅ Pas d'erreur si manque majuscules/chiffres/spéciaux | ✅ CONFORME |
|
||||
| **Pas de changement périodique forcé** | ✅ Aucune expiration automatique | ✅ CONFORME |
|
||||
| **Permettre les phrases de passe** | ✅ "Mon chat Félix a 3 ans!" accepté | ✅ CONFORME |
|
||||
|
||||
### Déviations par choix du client
|
||||
|
||||
| Recommandation NIST | Notre Implémentation | Raison |
|
||||
|-------------------|---------------------|--------|
|
||||
| **Email unique par compte** | ❌ Plusieurs comptes par email autorisés | Demande client |
|
||||
| **Mot de passe ≠ identifiant** | ❌ Mot de passe = identifiant autorisé | Demande client |
|
||||
| **Vérifier contexte utilisateur** | ❌ Pas de vérification nom/email dans mdp | Demande client |
|
||||
|
||||
### Vérification contre les mots de passe compromis
|
||||
|
||||
#### Have I Been Pwned (HIBP) API
|
||||
|
||||
L'implémentation utilise l'API HIBP avec la technique **k-anonymity** pour préserver la confidentialité :
|
||||
|
||||
1. **Hash SHA-1** du mot de passe
|
||||
2. **Envoi des 5 premiers caractères** du hash à l'API
|
||||
3. **Comparaison locale** avec les suffixes retournés
|
||||
4. **Aucun mot de passe en clair** n'est transmis
|
||||
|
||||
#### Mode "Fail Open"
|
||||
|
||||
En cas d'erreur de l'API HIBP :
|
||||
- Le système laisse passer le mot de passe
|
||||
- Un avertissement est enregistré dans les logs
|
||||
- L'utilisateur n'est pas bloqué
|
||||
|
||||
### Exemples de mots de passe
|
||||
|
||||
#### Acceptés (conformes NIST)
|
||||
- `monmotdepasse` → Accepté (≥8 caractères, pas compromis)
|
||||
- `12345678` → Accepté SI pas dans HIBP
|
||||
- `Mon chat s'appelle Félix!` → Accepté (phrase de passe)
|
||||
- ` ` → Accepté si ≥8 espaces
|
||||
- `😀🎉🎈🎁🎂🍰🎊🎀` → Accepté (8 émojis)
|
||||
- `jean.dupont` → Accepté même si = username
|
||||
|
||||
#### Refusés
|
||||
- `pass123` → Refusé (< 8 caractères)
|
||||
- `password` → Refusé (compromis dans HIBP)
|
||||
- `123456789` → Refusé (compromis dans HIBP)
|
||||
- Mot de passe > 64 caractères → Refusé
|
||||
|
||||
### Force des mots de passe
|
||||
|
||||
Le système privilégie la **LONGUEUR** sur la complexité (conforme NIST) :
|
||||
|
||||
| Longueur | Force | Score |
|
||||
|----------|-------|-------|
|
||||
| < 8 car. | Trop court | 0-10 |
|
||||
| 8-11 car. | Acceptable | 20-40 |
|
||||
| 12-15 car. | Bon | 40-60 |
|
||||
| 16-19 car. | Fort | 60-80 |
|
||||
| ≥20 car. | Très fort | 80-100 |
|
||||
| Compromis | Compromis | ≤10 |
|
||||
|
||||
### Génération automatique
|
||||
|
||||
Pour la génération automatique, le système reste **strict** pour garantir des mots de passe forts :
|
||||
- Longueur : 12-16 caractères
|
||||
- Contient : majuscules + minuscules + chiffres + spéciaux
|
||||
- Vérifié contre HIBP (10 tentatives max)
|
||||
- Exemple : `Xk9#mP2$nL5!`
|
||||
|
||||
### Gestion des comptes multiples par email
|
||||
|
||||
Depuis janvier 2025, le système permet plusieurs comptes avec le même email :
|
||||
|
||||
#### Fonction `lostPassword` adaptée
|
||||
- Recherche **TOUS** les comptes avec l'email fourni
|
||||
- Génère **UN SEUL** mot de passe pour tous ces comptes
|
||||
- Met à jour **TOUS** les comptes en une requête
|
||||
- Envoie **UN SEUL** email avec la liste des usernames concernés
|
||||
|
||||
#### Exemple de comportement
|
||||
Si 3 comptes partagent l'email `contact@amicale.fr` :
|
||||
- `jean.dupont`
|
||||
- `marie.martin`
|
||||
- `paul.durand`
|
||||
|
||||
L'email contiendra :
|
||||
```
|
||||
Bonjour,
|
||||
Voici votre nouveau mot de passe pour les comptes : jean.dupont, marie.martin, paul.durand
|
||||
Mot de passe : XyZ123!@#
|
||||
```
|
||||
|
||||
### Endpoints API dédiés aux mots de passe
|
||||
|
||||
#### Vérification de force (public)
|
||||
```http
|
||||
POST /api/password/check
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"password": "monmotdepasse",
|
||||
"check_compromised": true
|
||||
}
|
||||
```
|
||||
|
||||
**Réponse :**
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"valid": false,
|
||||
"errors": [
|
||||
"Ce mot de passe a été trouvé 23 547 fois dans des fuites de données."
|
||||
],
|
||||
"warnings": [
|
||||
"Suggestion : Évitez les séquences communes pour plus de sécurité"
|
||||
],
|
||||
"strength": {
|
||||
"score": 20,
|
||||
"strength": "Faible",
|
||||
"feedback": ["Ce mot de passe a été compromis"],
|
||||
"length": 13,
|
||||
"diversity": 1
|
||||
},
|
||||
"compromised": {
|
||||
"compromised": true,
|
||||
"occurrences": 23547,
|
||||
"message": "Ce mot de passe a été trouvé 23 547 fois dans des fuites de données"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Vérification de compromission uniquement (public)
|
||||
```http
|
||||
POST /api/password/compromised
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"password": "monmotdepasse"
|
||||
}
|
||||
```
|
||||
|
||||
#### Génération automatique (authentifié)
|
||||
```http
|
||||
GET /api/password/generate?length=14
|
||||
Authorization: Bearer {session_id}
|
||||
```
|
||||
|
||||
**Réponse :**
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"password": "Xk9#mP2$nL5!qR",
|
||||
"length": 14,
|
||||
"strength": {
|
||||
"score": 85,
|
||||
"strength": "Très fort",
|
||||
"feedback": []
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Configuration et sécurité
|
||||
|
||||
#### Paramètres de sécurité
|
||||
- **Timeout API HIBP** : 5 secondes
|
||||
- **Cache** : 15 minutes pour les vérifications répétées
|
||||
- **Logging** : Aucun mot de passe en clair dans les logs
|
||||
- **K-anonymity** : Seuls 5 caractères du hash SHA-1 envoyés
|
||||
|
||||
#### Points d'intégration
|
||||
- `LoginController::register` : Validation lors de l'inscription
|
||||
- `LoginController::lostPassword` : Génération sécurisée
|
||||
- `UserController::createUser` : Validation si mot de passe manuel
|
||||
- `UserController::updateUser` : Validation lors du changement
|
||||
- `ApiService::generateSecurePassword` : Génération avec vérification HIBP
|
||||
|
||||
### Résumé
|
||||
|
||||
✅ **100% CONFORME NIST** pour les aspects techniques
|
||||
✅ **Adapté aux besoins du client** (emails multiples, mdp=username)
|
||||
✅ **Sécurité maximale** avec vérification HIBP
|
||||
✅ **Expérience utilisateur optimale** (souple mais sécurisé)
|
||||
|
||||
## Endpoints API
|
||||
|
||||
### Routes Publiques vs Privées
|
||||
@@ -573,6 +779,24 @@ fetch('/api/endpoint', {
|
||||
|
||||
## Changements récents
|
||||
|
||||
### Version 3.0.7 (Janvier 2025)
|
||||
|
||||
#### 1. Implémentation complète de la norme NIST SP 800-63B pour les mots de passe
|
||||
- **Nouveau service :** `PasswordSecurityService` pour la gestion sécurisée des mots de passe
|
||||
- **Vérification HIBP :** Intégration de l'API Have I Been Pwned avec k-anonymity
|
||||
- **Validation souple :** Suppression des obligations de composition (majuscules, chiffres, spéciaux)
|
||||
- **Support Unicode :** Acceptation de tous les caractères, incluant émojis et espaces
|
||||
- **Nouveaux endpoints :** `/api/password/check`, `/api/password/compromised`, `/api/password/generate`
|
||||
|
||||
#### 2. Autorisation des emails multiples
|
||||
- **Suppression de l'unicité :** Un même email peut être utilisé pour plusieurs comptes
|
||||
- **Adaptation de `lostPassword` :** Mise à jour de tous les comptes partageant l'email
|
||||
- **Un seul mot de passe :** Tous les comptes avec le même email reçoivent le même nouveau mot de passe
|
||||
|
||||
#### 3. Autorisation mot de passe = identifiant
|
||||
- **Choix client :** Permet d'avoir un mot de passe identique au nom d'utilisateur
|
||||
- **Pas de vérification contextuelle :** Aucune vérification nom/email dans le mot de passe
|
||||
|
||||
### Version 3.0.6 (Janvier 2025)
|
||||
|
||||
#### 1. Correction des rôles administrateurs
|
||||
|
||||
Reference in New Issue
Block a user