In Entwicklung Letztes Updateated:
Teilen:
Cloudways bietet verwaltetes Cloud-Hosting für Unternehmen jeder Größe zum Hosten einer Website oder komplexer Webanwendungen.

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 und m2 so dass der Hash von m1 ist gleich dem Hash von m2. Diese Eigenschaft wird aufgerufen Kollisionsfestigkeit.
  • Zweites Urbild resistent: Dies bedeutet eine Nachricht erhalten m1 und den dazugehörigen Hash m2, ist es unmöglich, eine andere Nachricht zu finden m2 so dass hash(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önnen new() 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 der hexdigest() 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.

Teilen:
  • Bala Priya C
    Autor
    Bala Priya ist ein Entwickler und technischer Redakteur aus Indien mit über drei Jahren Erfahrung im Bereich des Schreibens technischer Inhalte. Sie teilt ihre Erkenntnisse mit der Entwickler-Community, indem sie technische Tutorials, Anleitungen und mehr verfasst.

Danke an unsere Sponsoren

Weitere großartige Lektüre zum Thema Entwicklung

Erstellen einer Architektur-Landebahn für das SAFe-Portfolio
Erstellen einer Architektur-Landebahn für das SAFe-Portfolio

Haben Sie sich jemals gefragt, wie es möglich ist, dass jedes Mal, wenn Ihr Product Owner ein neues Feature-Thema einbringt, die Antwort des Teams lautet, dass es etwas untersuchen muss?ate technische Möglichkeiten und Create Sie benötigen eine Form von Design, bevor sie sicher sein können, wie diese Funktion entwickelt werden soll? Dann liegt das höchstwahrscheinlich daran, dass bei Ihnen kein Architecture Runway vorhanden ist.

Treiben Sie Ihr Geschäft an

Einige der Tools und Services, die Ihrem Unternehmen helfen grow.