Aller au contenu

610 generer identifiants empreintes

Générer des identifiants et des empreintes

uuid : identifiants UUID

uuid4() produit un UUID aléatoire ; UUID(text) analyse un identifiant existant. uuid5(namespace, name) produit un identifiant déterministe à partir d'un espace de noms et d'un nom.

import uuid

identifier = uuid.uuid4()
print(str(identifier))
print(uuid.UUID(str(identifier)) == identifier)  # True

Un UUID fournit un identifiant avec un risque de collision extrêmement faible. Il ne représente pas, à lui seul, une autorisation d'accès.

Parallèle C# et .NET

Guid identifier = Guid.NewGuid();
Console.WriteLine(identifier.ToString());
Console.WriteLine(Guid.Parse(identifier.ToString()) == identifier); // True

Guid.NewGuid() correspond au besoin d’un UUID aléatoire de version 4 sur les plateformes prises en charge. Guid.Parse() et TryParse() lisent les représentations textuelles. Le runtime .NET 8 n’expose pas de méthode native équivalente à uuid5() ; les UUID déterministes exigent une implémentation ou une bibliothèque adaptée.

secrets : valeurs aléatoires pour les secrets

Fonction Usage
token_hex(nbytes) Jeton hexadécimal.
token_urlsafe(nbytes) Jeton adapté aux URL.
token_bytes(nbytes) Octets aléatoires.
choice(sequence) Sélection sécurisée.
randbelow(n) Entier aléatoire strictement inférieur à n.
compare_digest(a, b) Comparaison conçue pour limiter les fuites temporelles.
import secrets

token = secrets.token_urlsafe(32)
print(len(token))  # 43

Pour un jeton d'accès réel, transmettons-le uniquement au destinataire concerné et évitons de le journaliser. secrets répond aux besoins de sécurité que random ne couvre pas.

Parallèle C# et .NET

byte[] bytes = RandomNumberGenerator.GetBytes(32);
string token = Convert.ToBase64String(bytes).TrimEnd('=').Replace('+', '-').Replace('/', '_');
Console.WriteLine(token.Length); // 43
int number = RandomNumberGenerator.GetInt32(100); // De 0 à 99
bool same = CryptographicOperations.FixedTimeEquals(bytes, bytes.ToArray());
Console.WriteLine(same); // True

RandomNumberGenerator répond au besoin d’aléatoire cryptographique. La conversion construit ici du Base64 URL sans remplissage, proche de token_urlsafe(). FixedTimeEquals() compare des octets ; les conditions exactes, notamment les longueurs, comptent. Les jetons ne doivent pas être confondus avec des UUID ni exposés dans les journaux.

hashlib : empreintes de données

sha256() et sha512() construisent des objets de hachage. update() ajoute des octets ; digest() fournit l'empreinte binaire et hexdigest() sa représentation hexadécimale.

import hashlib

message = "Bonjour Python".encode("utf-8")
fingerprint = hashlib.sha256(message).hexdigest()
print(len(fingerprint))  # 64

Une empreinte sert notamment à comparer des contenus. Elle ne chiffre pas les données et ne prouve pas leur origine. Un simple SHA-256 n'est pas adapté au stockage des mots de passe ; utilisons un mécanisme dédié de dérivation de clé. Pour authentifier un message avec une clé partagée, le module hmac répond à un autre besoin.

Parallèle C# et .NET

byte[] message = Encoding.UTF8.GetBytes("Bonjour Python");
byte[] digest = SHA256.HashData(message);
string fingerprint = Convert.ToHexString(digest).ToLowerInvariant();
Console.WriteLine(fingerprint.Length); // 64

SHA256.HashData() fournit une empreinte en un appel. IncrementalHash permet l’alimentation progressive comparable à update(). Pour les mêmes octets, les empreintes SHA-256 sont identiques entre les deux environnements. L’encodage du texte doit donc être choisi explicitement. Le hachage cryptographique diffère de GetHashCode() et de hash() Python.