15.1. hashlib — Algorithmes de hachage sécurisés et synthèse de messages

Code source : Lib/hashlib.py


Ce module implémente une interface commune à différents algorithmes de hachage sécurisés et de synthèse de messages. Sont inclus les algorithmes standards FIPS de hachage SHA1, SHA224, SHA256, SHA384, et SHA512 (définis dans FIPS 180-2) ainsi que l’algorithme MD5 de RSA (défini par la RFC 1321). Les termes « algorithmes de hachage sécurisé » et « algorithme de synthèse de message » sont interchangeables. Les anciens algorithmes étaient appelés » algorithmes de synthèse de messages ». Le terme moderne est « algorithme de hachage sécurisé ».

Note

Si vous préférez utiliser les fonctions de hachage adler32 ou crc32, elles sont disponibles dans le module zlib.

Avertissement

Certains algorithmes ont des faiblesses connues relatives à la collision, se référer à la section « Voir aussi » à la fin.

15.1.1. Algorithmes de hachage

There is one constructor method named for each type of hash. All return a hash object with the same simple interface. For example: use sha1() to create a SHA1 hash object. You can now feed this object with bytes-like objects (normally bytes) using the update() method. At any point you can ask it for the digest of the concatenation of the data fed to it so far using the digest() or hexdigest() methods.

Note

Pour de meilleures performances avec de multiples fils d’exécution, le GIL Python est relâché pour des données dont la taille est supérieure à 2047 octets lors de leur création ou leur mise à jour.

Note

Fournir des objets chaînes de caractères à la méthode update() n’est pas implémenté, comme les fonctions de hachages travaillent sur des bytes et pas sur des caractères.

Constructors for hash algorithms that are always present in this module are md5(), sha1(), sha224(), sha256(), sha384(), and sha512(). Additional algorithms may also be available depending upon the OpenSSL library that Python uses on your platform.

Par exemple, pour obtenir l’empreinte de la chaîne b'Nobody inspects the spammish repetition' :

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
>>> m.digest_size
16
>>> m.block_size
64

En plus condensé :

>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
hashlib.new(name[, data])

Is a generic constructor that takes the string name of the desired algorithm as its first parameter. It also exists to allow access to the above listed hashes as well as any other algorithms that your OpenSSL library may offer. The named constructors are much faster than new() and should be preferred.

En utilisant new() avec un algorithme fourni par OpenSSL :

>>> h = hashlib.new('ripemd160')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'

Hashlib fournit les constantes suivantes :

hashlib.algorithms_guaranteed

A set containing the names of the hash algorithms guaranteed to be supported by this module on all platforms.

Nouveau dans la version 3.2.

hashlib.algorithms_available

Un ensemble contenant les noms des algorithmes de hachage disponibles dans l’interpréteur Python. Ces noms sont reconnus lorsqu’ils sont passés à la fonction new(). algorithms_guaranteed est toujours un sous-ensemble. Le même algorithme peut apparaître plusieurs fois dans cet ensemble sous un nom différent (grâce à OpenSSL).

Nouveau dans la version 3.2.

Les valeurs suivantes sont fournis en tant qu’attributs constants des objets hachés retournés par les constructeurs :

hash.digest_size

La taille du hash résultant en octets.

hash.block_size

La taille interne d’un bloc de l’algorithme de hachage en octets.

L’objet haché possède les attributs suivants :

hash.name

Le nom canonique de cet objet haché, toujours en minuscule et toujours transmissible à la fonction new() pour créer un autre objet haché de ce type.

Modifié dans la version 3.4: L’attribut name est présent dans CPython depuis sa création, mais n’était pas spécifié formellement jusqu’à Python 3.4, il peut ne pas exister sur certaines plate-formes.

L’objet haché possède les méthodes suivantes :

hash.update(arg)

Update the hash object with the object arg, which must be interpretable as a buffer of bytes. Repeated calls are equivalent to a single call with the concatenation of all the arguments: m.update(a); m.update(b) is equivalent to m.update(a+b).

Modifié dans la version 3.1: Le GIL Python est relâché pour permettre aux autres fils d’exécution de tourner pendant que la fonction de hachage met à jour des données plus larges que 2047 octets, lorsque les algorithmes fournis par OpenSSL sont utilisés.

hash.digest()

Renvoie le digest des données passées à la méthode update(). C’est un objet de type bytes de taille digest_size qui contient des octets dans l’intervalle 0 à 255.

hash.hexdigest()

Comme la méthode digest() sauf que le digest renvoyé est une chaîne de caractères de longueur double, contenant seulement des chiffres hexadécimaux. Cela peut être utilisé pour échanger sans risque des valeurs dans les e-mails ou dans les environnements non binaires.

hash.copy()

Renvoie une copie (« clone ») de l’objet haché. Cela peut être utilisé pour calculer efficacement les digests de données partageant des sous-chaînes communes.

15.1.2. Dérivation de clé

Les algorithmes de dérivation de clés et d’étirement de clés sont conçus pour le hachage sécurisé de mots de passe. Des algorithmes naïfs comme sha1(password) ne sont pas résistants aux attaques par force brute. Une bonne fonction de hachage doit être paramétrable, lente, et inclure un sel.

hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)

La fonction fournit une fonction de dérivation PKCS#5 (Public Key Cryptographic Standards #5 v2.0). Elle utilise HMAC comme fonction de pseudo-aléatoire.

La chaîne de caractères hash_name est le nom de l’algorithme de hachage désiré pour le HMAC, par exemple "sha1" ou "sha256". password et salt sont interprétés comme des tampons d’octets. Les applications et bibliothèques doivent limiter password à une longueur raisonnable (comme 1024). salt doit être de 16 octets ou plus provenant d’une source correcte, e.g. os.urandom().

Le nombre d”iterations doit être choisi sur la base de l’algorithme de hachage et de la puissance de calcul. En 2013, au moins 100000 itérations de SHA-256 sont recommandées.

dklen est la longueur de la clé dérivée. Si dklen vaut None alors la taille du message de l’algorithme de hachage hash_name est utilisé, e.g. 64 pour SHA-512.

>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> binascii.hexlify(dk)
b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'

Nouveau dans la version 3.4.

Note

Une implémentation rapide de pbkdf2_hmac est disponible avec OpenSSL. L’implémentation Python utilise une version anonyme de hmac. Elle est trois fois plus lente et ne libère pas le GIL.

Voir aussi

Module hmac
Un module pour générer des codes d’authentification utilisant des hash.
Module base64
Un autre moyen d’encoder des hash binaires dans des environnements non binaires.
http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
La publication FIPS 180-2 sur les algorithmes de hachage sécurisés.
https://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms
Article Wikipedia contenant les informations relatives aux algorithmes ayant des problèmes et leur interprétation au regard de leur utilisation.
https://www.ietf.org/rfc/rfc2898.txt
PKCS #5: Password-Based Cryptography Specification Version 2.0