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 tom.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 tailledigest_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 (comme1024
). 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