Creer des mots de passe forts et aleatoires est un defi que chaque administrateur et developpeur rencontre regulierement — que ce soit pour configurer des comptes de service, provisionner des identifiants utilisateur ou generer des cles API. Ce guide couvre plusieurs methodes pour generer des mots de passe aleatoires securises sur differentes plateformes, ainsi que les meilleures pratiques pour la complexite et le stockage des mots de passe.

Exigences de complexite des mots de passe

Avant de generer des mots de passe, comprenez ce qui rend un mot de passe fort :

  • Longueur — Minimum 14 caracteres pour les comptes administratifs, 12 pour les utilisateurs standard
  • Variete de caracteres — Incluez des lettres majuscules, des lettres minuscules, des chiffres et des caracteres speciaux
  • Aleatoire — Utilisez un generateur de nombres aleatoires cryptographiquement securise, pas un modele previsible
  • Unicite — Chaque compte doit avoir un mot de passe different

La plupart des cadres de conformite (NIST, PCI-DSS, HIPAA) exigent que les mots de passe respectent des regles de complexite specifiques. Le NIST SP 800-63B recommande de se concentrer sur la longueur du mot de passe plutot que sur les exigences de complexite, mais de nombreux systemes imposent encore des types de caracteres mixtes.

Methodes PowerShell

Utilisation de la classe Membership

La methode la plus simple dans PowerShell utilise la classe System.Web.Security.Membership :

# Load the System.Web assembly
Add-Type -AssemblyName System.Web

# Generate a single password (16 characters, minimum 4 special characters)
[System.Web.Security.Membership]::GeneratePassword(16, 4)

# Generate multiple passwords
1..10 | ForEach-Object {
    [System.Web.Security.Membership]::GeneratePassword(20, 5)
}

Le premier parametre est la longueur totale et le second est le nombre minimum de caracteres non alphanumeriques.

Generateur de mots de passe personnalise dans PowerShell

Pour plus de controle sur les ensembles de caracteres et le formatage :

function New-RandomPassword {
    param(
        [int]$Length = 16,
        [int]$MinUpperCase = 2,
        [int]$MinLowerCase = 2,
        [int]$MinDigits = 2,
        [int]$MinSpecial = 2
    )

    $upper   = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    $lower   = 'abcdefghijklmnopqrstuvwxyz'
    $digits  = '0123456789'
    $special = '!@#$%^&*()-_=+[]{}|;:,.<>?'

    $password = @()

    # Ensure minimum requirements
    $password += ($upper.ToCharArray()   | Get-Random -Count $MinUpperCase)
    $password += ($lower.ToCharArray()   | Get-Random -Count $MinLowerCase)
    $password += ($digits.ToCharArray()  | Get-Random -Count $MinDigits)
    $password += ($special.ToCharArray() | Get-Random -Count $MinSpecial)

    # Fill remaining length with random characters from all sets
    $allChars = $upper + $lower + $digits + $special
    $remaining = $Length - $password.Count
    if ($remaining -gt 0) {
        $password += ($allChars.ToCharArray() | Get-Random -Count $remaining)
    }

    # Shuffle the result
    $password = $password | Get-Random -Count $password.Count

    return -join $password
}

# Generate a single password
New-RandomPassword -Length 20

# Generate a batch of passwords
1..25 | ForEach-Object { New-RandomPassword -Length 16 }

Methode cryptographiquement securisee dans PowerShell

Pour la securite la plus elevee, utilisez System.Security.Cryptography.RandomNumberGenerator :

function New-SecurePassword {
    param([int]$Length = 20)

    $charSet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*'
    $bytes = New-Object byte[] $Length
    $rng = [System.Security.Cryptography.RandomNumberGenerator]::Create()
    $rng.GetBytes($bytes)

    $password = New-Object char[] $Length
    for ($i = 0; $i -lt $Length; $i++) {
        $password[$i] = $charSet[$bytes[$i] % $charSet.Length]
    }

    return -join $password
}

New-SecurePassword -Length 24

Generation de mots de passe cryptographiques en .NET

Utilisation de RandomNumberGenerator (Recommande)

En .NET, RandomNumberGenerator (qui a remplace l’ancien RNGCryptoServiceProvider) est la bonne facon de generer des donnees aleatoires cryptographiquement securisees :

using System.Security.Cryptography;

public static string GeneratePassword(int length = 20)
{
    const string chars =
        "abcdefghijklmnopqrstuvwxyz" +
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
        "0123456789" +
        "!@#$%^&*()-_=+[]{}|;:,.<>?";

    var password = new char[length];
    var randomBytes = new byte[length];

    using (var rng = RandomNumberGenerator.Create())
    {
        rng.GetBytes(randomBytes);
    }

    for (int i = 0; i < length; i++)
    {
        password[i] = chars[randomBytes[i] % chars.Length];
    }

    return new string(password);
}

Pourquoi ne pas utiliser System.Random ?

N’utilisez jamais System.Random pour la generation de mots de passe :

// DO NOT use this for passwords -- it is predictable!
var random = new Random();
// An attacker who knows the seed can predict every output

System.Random utilise un generateur de nombres pseudo-aleatoires deterministe. Si un attaquant peut deviner ou determiner la graine (par exemple, l’heure systeme a l’initialisation), il peut reproduire toute la sequence. RandomNumberGenerator utilise la source aleatoire cryptographique du systeme d’exploitation, qui est adaptee aux operations sensibles a la securite.

Methodes en ligne de commande Linux

Utilisation d’openssl

# Generate a 24-character random password (base64 encoded)
openssl rand -base64 24

# Generate a hex-encoded password
openssl rand -hex 16

Utilisation de pwgen

L’utilitaire pwgen genere des mots de passe prononcables (ou entierement aleatoires) :

# Install pwgen
sudo apt install pwgen    # Debian/Ubuntu
sudo yum install pwgen    # RHEL/CentOS

# Generate one 16-character secure password
pwgen -s 16 1

# Generate 20 passwords of 20 characters each, fully random
pwgen -s -y 20 20

# Options:
#   -s  Fully random (not pronounceable)
#   -y  Include special characters
#   -c  Include at least one capital letter (default)
#   -n  Include at least one number (default)

Utilisation de /dev/urandom

# Generate a 20-character alphanumeric password
< /dev/urandom tr -dc 'A-Za-z0-9!@#$%^&*' | head -c 20; echo

# Generate multiple passwords
for i in $(seq 1 10); do
    < /dev/urandom tr -dc 'A-Za-z0-9!@#$%^&*()-_=+' | head -c 20
    echo
done

Utilisation de Python

# One-liner for a 20-character password
python3 -c "import secrets, string; print(''.join(secrets.choice(string.ascii_letters + string.digits + string.punctuation) for _ in range(20)))"

Le module secrets dans Python 3.6+ est specialement concu pour generer des jetons et des mots de passe cryptographiquement securises.

Generation de mots de passe en masse pour le provisionnement d’utilisateurs

Lors du provisionnement de plusieurs comptes, vous pouvez combiner la generation de mots de passe avec une sortie CSV :

PowerShell : Generer des mots de passe pour une liste d’utilisateurs

# Read a list of usernames and generate passwords
$users = Import-Csv -Path "C:\users.csv"

$results = foreach ($user in $users) {
    [PSCustomObject]@{
        Username = $user.Username
        Password = [System.Web.Security.Membership]::GeneratePassword(16, 4)
    }
}

$results | Export-Csv -Path "C:\user-passwords.csv" -NoTypeInformation

Bash : Generer des mots de passe a partir d’une liste d’utilisateurs

#!/bin/bash
while IFS= read -r username; do
    password=$(< /dev/urandom tr -dc 'A-Za-z0-9!@#$%^&*' | head -c 16)
    echo "$username,$password"
done < users.txt > user-passwords.csv

Pratiques de stockage securise des mots de passe

Generer des mots de passe forts n’est que la moitie de la bataille. Les stocker en toute securite est tout aussi important.

Pour l’authentification des utilisateurs (Hachage)

Ne stockez jamais les mots de passe des utilisateurs en texte clair. Utilisez un algorithme de hachage unidirectionnel avec un sel unique :

  • bcrypt — L’algorithme le plus largement recommande pour le hachage de mots de passe. Inclut un salage integre et un facteur de travail configurable.
  • scrypt — Algorithme a forte intensite memoire qui resiste aux attaques basees sur GPU.
  • Argon2 — Gagnant de la Password Hashing Competition. Offre la meilleure resistance aux attaques modernes.

Evitez MD5 et SHA-1/SHA-256 pour le hachage de mots de passe — ils sont trop rapides, ce qui rend les attaques par force brute realisables.

Pour les secrets d’application (Gestion des secrets)

Pour les mots de passe utilises par les applications (identifiants de base de donnees, cles API, mots de passe de comptes de service) :

  • Azure Key Vault — Stockage gere de secrets pour les environnements Azure
  • AWS Secrets Manager — Stockage gere de secrets avec support de rotation automatique
  • HashiCorp Vault — Gestion de secrets open source pour tout environnement
  • Variables d’environnement — Acceptable pour le developpement, mais utilisez un gestionnaire de secrets en production

Ne stockez jamais de secrets dans :

  • Les depots de code source
  • Les fichiers de configuration enregistres dans le controle de version
  • Les fichiers texte non chiffres sur les serveurs
  • Les documents ou wikis partages

Gestionnaire de mots de passe pour usage personnel

Pour gerer les mots de passe individuels, utilisez un gestionnaire de mots de passe :

  • Bitwarden — Open source, multiplateforme
  • 1Password — Riche en fonctionnalites, avec des forfaits equipe et famille
  • KeePass — Hors ligne, open source

Resume

Generer des mots de passe aleatoires securises necessite l’utilisation de generateurs de nombres aleatoires cryptographiquement securises — que ce soit via la classe Membership de PowerShell, le RandomNumberGenerator de .NET ou des outils Linux comme openssl et pwgen. Evitez les sources previsibles comme System.Random ou le simple martellement du clavier. Pour le provisionnement en masse, scriptez le processus de generation et exportez dans un format securise. Stockez toujours les mots de passe en utilisant des algorithmes de hachage appropries pour l’authentification ou un gestionnaire de secrets pour les identifiants d’application.