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:
@@ -5,8 +5,10 @@ declare(strict_types=1);
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
use App\Services\PasswordSecurityService;
|
||||
|
||||
require_once __DIR__ . '/EmailTemplates.php';
|
||||
require_once __DIR__ . '/PasswordSecurityService.php';
|
||||
|
||||
class ApiService {
|
||||
|
||||
@@ -277,34 +279,49 @@ class ApiService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Génère un mot de passe sécurisé aléatoire
|
||||
* Génère un mot de passe sécurisé aléatoire non compromis
|
||||
* Utilise le service PasswordSecurityService pour vérifier contre HIBP
|
||||
*
|
||||
* @param int $minLength Longueur minimale du mot de passe (par défaut 12)
|
||||
* @param int $maxLength Longueur maximale du mot de passe (par défaut 16)
|
||||
* @return string Mot de passe généré
|
||||
*/
|
||||
public static function generateSecurePassword(int $minLength = 12, int $maxLength = 16): string {
|
||||
$lowercase = 'abcdefghijklmnopqrstuvwxyz';
|
||||
$uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
$numbers = '0123456789';
|
||||
$special = '!@#$%^&*()_+-=[]{}|;:,.<>?';
|
||||
$length = random_int($minLength, $maxLength);
|
||||
|
||||
// Utiliser le nouveau service pour générer un mot de passe non compromis
|
||||
$password = PasswordSecurityService::generateSecurePassword($length, 10);
|
||||
|
||||
// Si le service échoue (très rare), utiliser l'ancienne méthode
|
||||
if ($password === null) {
|
||||
LogService::log('Fallback vers génération de mot de passe classique', [
|
||||
'level' => 'warning',
|
||||
'reason' => 'PasswordSecurityService a échoué'
|
||||
]);
|
||||
|
||||
$lowercase = 'abcdefghijklmnopqrstuvwxyz';
|
||||
$uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
$numbers = '0123456789';
|
||||
$special = '!@#$%^&*()_+-=[]{}|;:,.<>?';
|
||||
|
||||
$length = rand($minLength, $maxLength);
|
||||
$password = '';
|
||||
$password = '';
|
||||
|
||||
// Au moins un de chaque type
|
||||
$password .= $lowercase[rand(0, strlen($lowercase) - 1)];
|
||||
$password .= $uppercase[rand(0, strlen($uppercase) - 1)];
|
||||
$password .= $numbers[rand(0, strlen($numbers) - 1)];
|
||||
$password .= $special[rand(0, strlen($special) - 1)];
|
||||
// Au moins un de chaque type
|
||||
$password .= $lowercase[random_int(0, strlen($lowercase) - 1)];
|
||||
$password .= $uppercase[random_int(0, strlen($uppercase) - 1)];
|
||||
$password .= $numbers[random_int(0, strlen($numbers) - 1)];
|
||||
$password .= $special[random_int(0, strlen($special) - 1)];
|
||||
|
||||
// Compléter avec des caractères aléatoires
|
||||
$all = $lowercase . $uppercase . $numbers . $special;
|
||||
for ($i = strlen($password); $i < $length; $i++) {
|
||||
$password .= $all[rand(0, strlen($all) - 1)];
|
||||
// Compléter avec des caractères aléatoires
|
||||
$all = $lowercase . $uppercase . $numbers . $special;
|
||||
for ($i = strlen($password); $i < $length; $i++) {
|
||||
$password .= $all[random_int(0, strlen($all) - 1)];
|
||||
}
|
||||
|
||||
// Mélanger le mot de passe
|
||||
return str_shuffle($password);
|
||||
}
|
||||
|
||||
// Mélanger le mot de passe
|
||||
return str_shuffle($password);
|
||||
|
||||
return $password;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user