Source : PyMOTW.
Fonctions cryptographiques de hachage : md5 et sha(s). La bibliothèque utilisée par ce module est OpenSSL.
Pour utiliser un des algorithmes de hachage suivants :
il faut appeler le constructeur associé, pour créer un objet hash. Le reste (l'interface de l'API) ne dépend plus du choix de la fonction de hachage.
Pour calculer le condensé md5 d'un bloc de données (par exemple, une chaîne ASCII), cela se passe en trois temps :
Par exemple :
>>> import hashlib >>> h = hashlib.md5() >>> h.update('coucou') >>> print h.hexdigest() 721a9b52bfceacc503c056e3b9b93cfa
On utilise la méthode hexdigest() dans ce qui précède, parce que la sortie de cette méthode est ici sensée être affichée.
Si, pour l'utilisation que l'on souhaite en faire, un condensé binaire est préférable, alors il faudra utiliser la méthode digest() :
>>> print h.digest() r��R�ά���V㹹<
Pour la fonction de hachage SHA-1, on procède exactement de la même manière :
>>> import hashlib >>> h = hashlib.sha1() >>> h.update('coucou') >>> print h.hexdigest() 5ed25af7b1ed23fb00122e13d7f74c4d8262acd8
Comme il a été précisé plus tôt, les méthodes sont les mêmes : seul le constructeur change.
Il peut être parfois plus pratique de faire référence directement au nom de l'algorithme de hachage (une chaîne de caractères, donc), plutôt qu'à un constructeur dépendant du condensé choisi.
(On peut, par exemple, imaginer vouloir stocker le nom de l'algorithme utilisé dans un fichier de configuration.)
Dans ce cas, il vaut mieux utiliser la fonction new(), comme suit :
>>> import hashlib >>> h = hashlib.new('sha256') >>> h.update('coucou') >>> print h.hexdigest()
On peut appeler la méthode update() plusieurs fois.
Dans ce cas, il n'y a pas "remise à zéro" : le nouveau texte clair est ajouté à l'ancien, et c'est la valeur hachée du tout qui est retournée, comme l'illustre l'exemple suivant :
>>> import hashlib >>> h=hashlib.md5() >>> h.update('Un') >>> h.hexdigest() '80a9a9f289a503c7e4218d1c34e05a02' >>> h.update('Deux') >>> h.hexdigest() '78dfde402ec1b856bd5be804a0da7ffe' >>> hh=hashlib.md5() >>> hh.update('UnDeux') >>> hh.hexdigest() '78dfde402ec1b856bd5be804a0da7ffe'
Dans ce qui précède, le condensé résultant de update('Un') suivi de update('Deux') est exactement le même que celui de update('UnDeux').
Cela peut servir quand le texte à condenser est grand : on pourra alors le lire morceau par morceau, et ainsi ne pas encombrer inutilement la mémoire.