Sicheres Hashing mit Python Hashlib

This tutorial will teach you how to create Sichere Hashes mithilfe der integrierten Funktionalität des Hashlib-Moduls von Python.
Understanding the significance of hashing and how to programmatically compute secure hashes can be helpful—even if you do not work in application security. But why?
Nun, wenn Sie an Python-Projekten arbeiten, werden Sie wahrscheinlich auf Fälle stoßen, in denen Sie Bedenken haben, Passwörter und andere vertrauliche Informationen in Datenbanken oder Quellcodedateien zu speichern. In solchen Fällen ist es sicherer, den Hash-Algorithmus auf vertrauliche Informationen anzuwenden und den Hash anstelle der Informationen zu speichern.
In diesem Leitfaden behandeln wir, was Hashing ist und wie es sich davon unterscheidet encryption. Wir werden auch die Eigenschaften von sicheren Hash-Funktionen durchgehen. Dann verwenden wir gängige Hash-Algorithmen, um den Hash des Klartexts in Python zu berechnen. Dazu verwenden wir das eingebaute Hashlib-Modul.
Für all dies und mehr, fangen wir an!
Was ist Hashing?
Der process of hashing takes in a message string and gives a fixed-length output called the Hash-. Meaning the length of the output hash for a given hashing algorithm is fixed – regardless of the length of the input. But how is it different from encryption?
In encryption, the message or plain text is encrypted using an encryption algorithm that gives an encrypted output. We can then run the decryption algorithm on the encrypted output to get back the message string.

However, hashing works differently. We just learned that the process of encryption ist invertierbar , dass Sie von der verschlüsselten Nachricht zur unverschlüsselten Nachricht und umgekehrt wechseln können.
Unlike encryption, hashing is nicht an invertible process, was bedeutet, wir kann keine gehen Sie vom Hash zur Eingabenachricht.

Eigenschaften von Hash-Funktionen
Lassen Sie uns schnell einige Eigenschaften durchgehen, die Hash-Funktionen erfüllen sollten:
- Deterministisch: Hash-Funktionen sind deterministisch. Bei einer Nachricht m ist der Hash von m immer gleich.
- Preimage Resistent: We’ve already covered this when we said hashing is not an invertible operation. The preimage resistance property states that it’s infeasible to find the message
m
aus dem Ausgabehash. - Kollisionsfest: It should be difficult (or computationally infeasible) to find two different message strings
m1
undm2
so dass der Hash vonm1
ist gleich dem Hash vonm2
. Diese Eigenschaft wird aufgerufen Kollisionsfestigkeit. - Zweites Urbild resistent: Dies bedeutet eine Nachricht erhalten
m1
und den dazugehörigen Hashm2
, ist es unmöglich, eine andere Nachricht zu findenm2
so dasshash(m1) = hash(m2)
.
Das Hashlib-Modul von Python
Python ist eingebaut Hashlib -Modul bietet Implementierungen mehrerer Hashing- und Message Digest-Algorithmen, einschließlich des SHA und MD5 Algorithmen.
Um die Konstruktoren und eingebauten Funktionen aus dem Python-Hashlib-Modul zu verwenden, können Sie es folgendermaßen in Ihre Arbeitsumgebung importieren:
import hashlib
Das Hashlib-Modul stellt die algorithms_available
und algorithms_guaranteed
constants, which denote the set of algorithms whose implementations are available and are guaranteed on a platform, respectively.
Daher sind algorithms_guaranteed
ist eine Teilmenge von algorithms_available
.

Starten Sie eine Python-REPL, importieren Sie die Hashlib und greifen Sie auf die algorithms_available
und algorithms_guaranteed
Konstanten:
>>> hashlib.algorithms_available
# Output
{'md5', 'md5-sha1', 'sha3_256', 'shake_128', 'sha384', 'sha512_256', 'sha512', 'md4',
'shake_256', 'whirlpool', 'sha1', 'sha3_512', 'sha3_384', 'sha256', 'ripemd160', 'mdc2',
'sha512_224', 'blake2s', 'blake2b', 'sha3_224', 'sm3', 'sha224'}
>>> hashlib.algorithms_guaranteed
# Output
{'md5', 'shake_256', 'sha3_256', 'shake_128', 'blake2b', 'sha3_224', 'sha3_384',
'sha384', 'sha256', 'sha1', 'sha3_512', 'sha512', 'blake2s', 'sha224'}
Wir sehen das algorithms_guaranteed
ist in der Tat eine Teilmenge von algorithms_available
Create Hash Objects in Python

Next let’s learn how to create hash objects in Python. We’ll compute the SHA256 hash of a message string using the following methods:
- Das Generikum
new()
Konstruktor - Algorithmusspezifische Konstruktoren
Verwenden des new()-Konstruktors
Lassen Sie uns die initialisieren message
Zeichenfolge:
>>> message = "Geekflare is awesome!"
To instantiate the hash object, we can use the new()
Konstruktor und übergeben Sie den Namen des Algorithmus wie gezeigt:
>>> sha256_hash = hashlib.new("SHA256")
Wir können jetzt anrufen update()
Methode auf dem Hash-Objekt mit der message
Zeichenfolge als Argument:
>>> sha256_hash.update(message)
Andernfalls tritt ein Fehler auf, da Hash-Algorithmen nur mit Byte-Strings arbeiten können.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing
Um die codierte Zeichenfolge zu erhalten, können Sie die aufrufen encode()
-Methode für die Methodenzeichenfolge und verwenden Sie sie dann in der update()
Methodenaufruf. Danach können Sie die anrufen hexdigest()
-Methode, um den sha256-Hash abzurufen, der der Nachrichtenzeichenfolge entspricht.
sha256_hash.update(message.encode())
sha256_hash.hexdigest()
# Output:'b360c77de704ad8f02af963d7da9b3bb4e0da6b81fceb4c1b36723e9d6d9de3d'
Anstatt die Nachrichtenzeichenfolge mit dem encode()
-Methode können Sie sie auch als eine Zeichenfolge von Bytes definieren, indem Sie der Zeichenfolge das Präfix voranstellen b
so:
message = b"Geekflare is awesome!"
sha256_hash.update(message)
sha256_hash.hexdigest()
# Output: 'b360c77de704ad8f02af963d7da9b3bb4e0da6b81fceb4c1b36723e9d6d9de3d'
The obtained hash is the same as previous hash, which confirms the deterministic nature of hash functions.
Außerdem eine kleine Änderung in der message
string should cause the hash to change drastically (also known as “avalanche effect”).
Um dies zu überprüfen, ändern wir das 'a' in 'awesome' in 'A' und berechnen den Hash:
message = "Geekflare is Awesome!"
h1 = hashlib.new("SHA256")
h1.update(message.encode())
h1.hexdigest()
# Output: '3c67f334cc598912dc66464f77acb71d88cfd6c8cba8e64a7b749d093c1a53ab'
Wir sehen, dass sich der Hash vollständig ändert.
Verwenden des algorithmusspezifischen Konstruktors
In der previous example, we used the generic new()
constructor and passed in “SHA256” as the name of the algorithm to create the hash object.
Stattdessen können wir auch die verwenden sha256()
Konstruktor wie gezeigt:
sha256_hash = hashlib.sha256()
message= "Geekflare is awesome!"
sha256_hash.update(message.encode())
sha256_hash.hexdigest()
# Output: 'b360c77de704ad8f02af963d7da9b3bb4e0da6b81fceb4c1b36723e9d6d9de3d'
Der Ausgabe-Hash ist identisch mit dem Hash, den wir zuvor für die erhalten haben message
Zeichenfolge „Geekflare is awesome!”.
Untersuchen von Attributen von Hash-Objekten
Die Hash-Objekte haben einige nützliche Attribute:
- Der
digest_size
attribute denotes the size of the digest in bytes. For example, the SHA256 algorithm returns a 256-bit hash, which is equivalent to 32 bytes - Der
block_size
Das Attribut bezieht sich auf die im Hash-Algorithmus verwendete Blockgröße. - Der
name
Das Attribut ist der Name des Algorithmus, den wir in verwenden könnennew()
constructor. Looking up the value of this attribute can be helpful when the hash objects don’t have descriptive names.
Wir können diese Attribute für die überprüfen sha256_hash
object we created earlier:
>>> sha256_hash.digest_size
32
>>> sha256_hash.block_size
64
>>> sha256_hash.name
'sha256'
Sehen wir uns als Nächstes einige interessante Hashing-Anwendungen mit Pythons hashlib-Modul an.
Praktische Beispiele für Hashing

Überprüfung der Integrität von Software und Dateien
Als Entwickler laden wir ständig Softwarepakete herunter und installieren sie. Dies gilt unabhängig davon, ob Sie an der arbeiten Linux-Distribution oder ein Windows or a Mac.
Jedoch einige mirrors for software packages möglicherweise nicht vertrauenswürdig. Sie finden den Hash (oder die Prüfsumme) neben dem Download-Link. Und Sie können die Integrität der heruntergeladenen Software überprüfen, indem Sie den Hash berechnen und mit dem offiziellen Hash vergleichen.
This can be applied to files on your machine as well. Even the smallest change in file contents will change the hash drastically, you can check if a file has been modified by verifying the hash.
Here’s a simple example. Create a text file ‘my_file.txt’ in the working directory, and add some content to it.
$ cat my_file.txt
This is a sample text file.
We are going to compute the SHA256 hash of this text file and also
check if the file has been modified by
recomputing the hash.
Sie können die Datei dann im Lesebinärmodus öffnen ('rb'
), lesen Sie den Inhalt der Datei ein und berechnen Sie den SHA256-Hash wie gezeigt:
>>> import hashlib
>>> with open("my_file.txt","rb") as file:
... file_contents = file.read()
... sha256_hash = hashlib.sha256()
... sha256_hash.update(file_contents)
... original_hash = sha256_hash.hexdigest()
Hier ist die Variable original_hash
is the hash of ‘my_file.txt’ in its current state.
>>> original_hash
# Output: '53bfd0551dc06c4515069d1f0dc715d002d451c8799add29f3e5b7328fda9f8f'
Now modify the file ‘my_file.txt’. You can remove the extra leading whitespace before the word ‘going’. 🙂
Berechnen Sie den Hash noch einmal und speichern Sie ihn in der computed_hash
variabel.
>>> import hashlib
>>> with open("my_file.txt","rb") as file:
... file_contents = file.read()
... sha256_hash = hashlib.sha256()
... sha256_hash.update(file_contents)
... computed_hash = sha256_hash.hexdigest()
Sie können dann eine einfache hinzufügen assert statement das behauptet, wenn die computed_hash
ist gleich dem original_hash
.
>>> assert computed_hash == original_hash
Wenn die Datei geändert wird (was in diesem Fall zutrifft), sollten Sie einen AssertionError erhalten:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
You can use hashing when storing sensitive info, such as passwords in databases. You can also use hashing in password authentication when connecting to databases. Validate the hash of the inputted password against the hash of the correct password.
Schlussfolgerung
Ich hoffe, dieses Tutorial hat Ihnen dabei geholfen, sichere Hashes mit Python zu generieren. Hier sind die wichtigsten Erkenntnisse:
- Python’s hashlib module provides ready-to-use implementations of several hashing algorithms. You can get the list of algorithms guaranteed on your platFormular verwenden
hashlib.algorithms_guaranteed
. - Create a hash object, you can use the generic
new()
Konstruktor mit der Syntax:hashlib.new("algo-name")
. Alternativ können Sie die Konstruktoren verwenden, die den spezifischen Hash-Algorithmen entsprechen, wie folgt:hashlib.sha256()
für den SHA 256-Hash. - Nachdem Sie die zu hashende Nachrichtenzeichenfolge und das Hash-Objekt initialisiert haben, können Sie die aufrufen
update()
-Methode für das Hash-Objekt, gefolgt von derhexdigest()
Methode, um den Hash zu erhalten. - Hashing kann sich als nützlich erweisen, wenn Sie die Integrität von Softwareartefakten und Dateien überprüfen, vertrauliche Informationen in Datenbanken speichern und vieles mehr.
Als nächstes lernen Sie, wie man a Random Password Generator bei Python.