Deep Dive in kryptografische Algorithmen mit Python
Emily Parker
Product Engineer · Leapcell

Analyse von häufig verwendeten Verschlüsselungsmethoden in der Internetentwicklung
In der heutigen Ära der dynamischen Entwicklung der Internettechnologie sind Daten wie das "Blut" der digitalen Welt. Ihre Sicherheit steht in direktem Zusammenhang mit den Rechten und Interessen der Nutzer, dem Ruf des Unternehmens und sogar der Stabilität des gesamten Netzwerk-Ökosystems. Von den Konto-Passwörtern bis zu den Finanztransaktionsdaten kann jede Information zum Ziel von Hackern werden. Als "Schild" zum Schutz der Datensicherheit spielt die Verschlüsselungstechnologie eine entscheidende und zentrale Rolle für die Internetentwicklung. Dieser Artikel analysiert eingehend verschiedene häufig verwendete Verschlüsselungsmethoden, darunter symmetrische Verschlüsselung, asymmetrische Verschlüsselung, Hash-Funktionen und Salting-Technologie. Anhand der Erläuterung von Prinzipien, Python-Codebeispielen und der Analyse von Implementierungsszenarien soll Entwicklern geholfen werden, diese Schlüsseltechnologien umfassend zu beherrschen.
I. Symmetrische Verschlüsselung
Wie der Name schon sagt, ist die symmetrische Verschlüsselung eine Verschlüsselungsmethode, bei der derselbe Schlüssel sowohl für die Ver- als auch für die Entschlüsselung verwendet wird. Ihr Hauptvorteil liegt in der extrem hohen Geschwindigkeit der Ver- und Entschlüsselung, die es ihr ermöglicht, große Datenmengen effizient zu verarbeiten. Dies führt zu ihrer breiten Anwendung in Szenarien der Datenübertragung und -speicherung. Zu den gängigen symmetrischen Verschlüsselungsalgorithmen gehören AES (Advanced Encryption Standard), DES (Data Encryption Standard) usw. Unter diesen hat sich AES mit seiner höheren Sicherheit und Leistung zum derzeit am weitesten verbreiteten symmetrischen Verschlüsselungsalgorithmus entwickelt.
Algorithmusprinzip
AES verwendet einen Blockverschlüsselungsmodus. Er teilt den Klartext in mehrere Datenblöcke mit fester Länge (normalerweise 128 Bit) auf und verschlüsselt dann jeden Datenblock mit dem Schlüssel, um Chiffretext zu erzeugen. Die Schlüssellänge kann als 128 Bit, 192 Bit oder 256 Bit gewählt werden. Je länger die Schlüssellänge, desto schwieriger ist es, sie zu knacken, und desto höher ist die Sicherheit. Wenn die Schlüssellänge beispielsweise 128 Bit beträgt, beträgt die theoretische Anzahl möglicher Schlüsselkombinationen bis zu 2 hoch 128, was das Knacken durch Brute-Force-Angriffe fast unmöglich macht.
Python-Implementierung
In Python kann die pycryptodome
-Bibliothek verwendet werden, um die AES-Ver- und Entschlüsselung zu implementieren. Im Folgenden wird der spezifische Code vorgestellt:
from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import os # AES-Verschlüsselungsfunktion def aes_encrypt(plain_text, key): # Erstellen Sie ein AES-Verschlüsselungsobjekt im CBC-Modus (Cipher Block Chaining), um die Sicherheit der Verschlüsselung zu erhöhen cipher = AES.new(key, AES.MODE_CBC) # Initialisierungsvektor (IV), um die Zufälligkeit der Verschlüsselung zu erhöhen iv = cipher.iv # Füllen Sie den Klartext auf, damit seine Länge ein ganzzahliges Vielfaches von AES.block_size ist padded_plain_text = pad(plain_text.encode(), AES.block_size) # Verschlüsseln Sie den aufgefüllten Klartext cipher_text = cipher.encrypt(padded_plain_text) # Geben Sie den Initialisierungsvektor und den verschlüsselten Chiffretext zurück, da der Initialisierungsvektor für die Entschlüsselung benötigt wird return iv + cipher_text # AES-Entschlüsselungsfunktion def aes_decrypt(cipher_text, key): # Extrahieren Sie den Initialisierungsvektor iv = cipher_text[:AES.block_size] # Erstellen Sie ein AES-Entschlüsselungsobjekt mit dem extrahierten Initialisierungsvektor und dem Schlüssel cipher = AES.new(key, AES.MODE_CBC, iv) # Entschlüsseln Sie den Chiffretext und entfernen Sie den Padding-Anteil plain_text = unpad(cipher.decrypt(cipher_text[AES.block_size:]), AES.block_size) # Konvertieren Sie die entschlüsselten Bytedaten in eine Zeichenkette und geben Sie sie zurück return plain_text.decode() # Generieren Sie einen 128-Bit-Schlüssel (16 Byte) key = os.urandom(16) plain_text = "Hello, World!" cipher_text = aes_encrypt(plain_text, key) decrypted_text = aes_decrypt(cipher_text, key) print("Vor der AES-Verschlüsselung:", plain_text) print("Nach der AES-Verschlüsselung:", cipher_text.hex()) print("Nach der AES-Entschlüsselung:", decrypted_text)
Implementierungsszenarien
Während der Datenübertragung zwischen dem Client und dem Server wird häufig eine symmetrische Verschlüsselung verwendet, um die vertraulichen Informationen der Benutzer zu schützen. So können beispielsweise die von den Benutzern bei der Anmeldung eingegebenen Kontokennwörter, die Bankkartennummern bei Online-Zahlungen usw. alle über symmetrische Verschlüsselungsalgorithmen verschlüsselt und übertragen werden, um sicherzustellen, dass die Informationen während der Netzwerkübertragung nicht gestohlen werden. Darüber hinaus können sensible Daten, die in der Datenbank gespeichert sind, wie z. B. die Personalausweisnummern und Krankenakten der Benutzer, ebenfalls mit symmetrischer Verschlüsselung verschlüsselt und gespeichert werden, um die Datensicherheit weiter zu erhöhen.
II. Asymmetrische Verschlüsselung
Die asymmetrische Verschlüsselung unterscheidet sich von der symmetrischen Verschlüsselung. Sie verwendet ein Schlüsselpaar: einen öffentlichen Schlüssel und einen privaten Schlüssel. Der öffentliche Schlüssel kann veröffentlicht werden und wird zur Verschlüsselung von Daten verwendet, während der private Schlüssel vom Benutzer ordnungsgemäß aufbewahrt werden sollte und zur Entschlüsselung von Daten verwendet wird. Diese Verschlüsselungsmethode löst das Problem der Schlüsselverteilung bei der symmetrischen Verschlüsselung. Zu den gängigen asymmetrischen Verschlüsselungsalgorithmen gehören RSA, ECC (Elliptic Curve Cryptography Algorithm) usw., wobei RSA der am weitesten verbreitete ist.
Algorithmusprinzip
Der RSA-Algorithmus basiert auf der Schwierigkeit, große Zahlen zu faktorisieren. Vereinfacht ausgedrückt, werden zwei große Primzahlen multipliziert, um eine zusammengesetzte Zahl zu erhalten, und dann werden die zusammengesetzte Zahl und eine der Primzahlen als öffentlicher Schlüssel und die andere Primzahl als privater Schlüssel verwendet. Bei der Verschlüsselung wird der öffentliche Schlüssel verwendet, um den Klartext zu verschlüsseln; bei der Entschlüsselung wird der entsprechende private Schlüssel verwendet, um den Chiffretext zu entschlüsseln. Da die Faktorisierung einer großen zusammengesetzten Zahl in zwei Primzahlen äußerst schwierig ist, wird die Sicherheit des RSA-Algorithmus gewährleistet.
Python-Implementierung
Die pycryptodome
-Bibliothek kann verwendet werden, um die RSA-Ver- und Entschlüsselung zu implementieren. Der Code lautet wie folgt:
from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP import os # Funktion zum Generieren von RSA-Schlüsselpaaren def generate_rsa_keys(): # Generieren Sie ein 2048-Bit-RSA-Schlüsselpaar. Je länger die Schlüssellänge, desto höher die Sicherheit key = RSA.generate(2048) # Exportieren Sie den privaten Schlüssel private_key = key.export_key() # Exportieren Sie den öffentlichen Schlüssel public_key = key.publickey().export_key() # Speichern Sie den privaten Schlüssel in einer Datei with open("private.pem", "wb") as f: f.write(private_key) # Speichern Sie den öffentlichen Schlüssel in einer Datei with open("public.pem", "wb") as f: f.write(public_key) # RSA-Verschlüsselungsfunktion def rsa_encrypt(plain_text, public_key_path): # Lesen Sie die öffentliche Schlüsseldatei with open(public_key_path, "rb") as f: public_key = RSA.import_key(f.read()) # Erstellen Sie ein PKCS1_OAEP-Verschlüsselungsobjekt mit dem öffentlichen Schlüssel cipher = PKCS1_OAEP.new(public_key) # Verschlüsseln Sie den Klartext cipher_text = cipher.encrypt(plain_text.encode()) return cipher_text # RSA-Entschlüsselungsfunktion def rsa_decrypt(cipher_text, private_key_path): # Lesen Sie die private Schlüsseldatei with open(private_key_path, "rb") as f: private_key = RSA.import_key(f.read()) # Erstellen Sie ein PKCS1_OAEP-Entschlüsselungsobjekt mit dem privaten Schlüssel cipher = PKCS1_OAEP.new(private_key) # Entschlüsseln Sie den Chiffretext plain_text = cipher.decrypt(cipher_text) return plain_text.decode() # Generieren Sie RSA-Schlüsselpaare, wenn Sie das erste Mal laufen # generate_rsa_keys() public_key_path = "public.pem" private_key_path = "private.pem" plain_text = "Hello, RSA!" cipher_text = rsa_encrypt(plain_text, public_key_path) decrypted_text = rsa_decrypt(cipher_text, private_key_path) print("Vor der RSA-Verschlüsselung:", plain_text) print("Nach der RSA-Verschlüsselung:", cipher_text.hex()) print("Nach der RSA-Entschlüsselung:", decrypted_text)
Implementierungsszenarien
Die asymmetrische Verschlüsselung wird häufig in Szenarien des Schlüsselaustauschs und der digitalen Signaturen eingesetzt. Beim Schlüsselaustausch können der Client und der Server die Schlüssel für die symmetrische Verschlüsselung sicher über einen asymmetrischen Verschlüsselungsalgorithmus austauschen und dann den symmetrischen Verschlüsselungsalgorithmus verwenden, um eine große Datenmenge zu verschlüsseln und zu übertragen, wodurch ein Gleichgewicht zwischen Sicherheit und Effizienz erreicht wird. Im Hinblick auf digitale Signaturen verwenden Entwickler beispielsweise beim Veröffentlichen von Software ihre eigenen privaten Schlüssel, um die Software zu signieren, und Benutzer verwenden die öffentlichen Schlüssel der Entwickler, um die Signaturen zu überprüfen, um sicherzustellen, dass die Software während des Übertragungsprozesses nicht manipuliert wurde.
III. Hash-Funktionen
Eine Hash-Funktion kann Eingabedaten beliebiger Länge in einen Hash-Wert mit fester Länge umwandeln. Sie hat die Eigenschaft der unidirektionalen Irreversibilität, d. h. es ist unmöglich, die ursprünglichen Daten aus dem Hash-Wert wiederherzustellen. Gleichzeitig ist es sehr schwierig für verschiedene Eingabedaten, denselben Hash-Wert zu erhalten (Kollisionsresistenz). Zu den gängigen Hash-Funktionen gehören MD5 (Message Digest Algorithm 5), SHA - 1 (Secure Hash Algorithm 1), SHA - 256 usw. Obwohl MD5 einst weit verbreitet war, wird es aufgrund der Bedrohung seiner Kollisionsresistenz schrittweise durch SHA - 256 und andere in Szenarien mit hohen Sicherheitsanforderungen ersetzt.
MD5-Algorithmusprinzip
MD5 teilt die Eingabedaten in Blöcke von 512 Bit auf. Durch eine Reihe komplexer Hash-Operationen wird schließlich ein 128-Bit-Hash-Wert generiert. Mit der Verbesserung der Rechenleistung wurden jedoch Methoden gefunden, um denselben MD5-Hash-Wert für zwei verschiedene Eingaben zu erzeugen, was die Sicherheit von MD5 erheblich reduziert.
Python-Implementierung
Die eingebaute hashlib
-Bibliothek in Python kann die MD5-Hash-Berechnung auf einfache Weise implementieren. Der Beispielcode lautet wie folgt:
import hashlib # MD5-Hash-Berechnungsfunktion def md5_hash(plain_text): # Erstellen Sie ein MD5-Hash-Objekt md5 = hashlib.md5() # Aktualisieren Sie das Hash-Objekt mit den Klartextdaten, für die der Hash-Wert berechnet werden muss md5.update(plain_text.encode()) # Geben Sie den Hash-Wert in hexadezimaler Form zurück return md5.hexdigest() plain_text = "Hello, MD5!" md5_hash_value = md5_hash(plain_text) print("MD5-Hash-Wert:", md5_hash_value)
Implementierungsszenarien
Hash-Funktionen werden häufig zur Überprüfung der Datenintegrität verwendet. Während des Dateiübertragungsprozesses berechnet der Absender den Hash-Wert der Datei und sendet ihn an den Empfänger. Nach Erhalt der Datei berechnet der Empfänger den Hash-Wert neu. Durch den Vergleich der beiden Hash-Werte kann festgestellt werden, ob die Datei während des Übertragungsprozesses manipuliert wurde. Darüber hinaus besteht die traditionelle Vorgehensweise beim Speichern von Passwörtern darin, das Passwort des Benutzers über eine Hash-Funktion in einen Hash-Wert umzuwandeln und in der Datenbank zu speichern, um die Preisgabe von Klartextpasswörtern zu vermeiden. Diese Methode birgt jedoch gewisse Risiken und muss mit der Salting-Technologie kombiniert werden, um die Sicherheit weiter zu erhöhen.
IV. Salting-Technologie
Im Bereich der Passwortspeicherung können Angreifer Tools wie Rainbow Tables verwenden, um die Hash-Werte zu knacken und die Passwörter der Benutzer zu erhalten, wenn zur Verarbeitung von Passwörtern nur eine Hash-Funktion verwendet wird. Um dieses Problem zu lösen, wurde die Salting-Technologie entwickelt. Die Salting-Technologie besteht darin, dem Passwort einen zufällig generierten Salt-Wert (Salt) hinzuzufügen, den Salt-Wert mit dem Passwort zu mischen und dann eine Hash-Verarbeitung durchzuführen und schließlich den Salt-Wert und den Hash-Wert zusammen zu speichern.
Technisches Prinzip
Der Salt-Wert ist eine zufällig generierte Zeichenkette, und der Salt-Wert, der jedes Mal generiert wird, ist unterschiedlich. Selbst wenn zwei Benutzer dasselbe Passwort verwenden, sind die generierten Hash-Werte aufgrund unterschiedlicher Salt-Werte ebenfalls unterschiedlich. Dies erhöht die Schwierigkeit für Angreifer, Passwörter über Rainbow Tables zu knacken, erheblich und verbessert die Sicherheit der Passwortspeicherung effektiv.
Python-Implementierung
Der Code für die Implementierung von Salted Hashing und Passwortverifizierung mit der hashlib
-Bibliothek lautet wie folgt:
import hashlib import os # Salted Hashing-Funktion def salted_hash(password, salt=None): if salt is None: # Generieren Sie einen 16-Byte-Salt-Wert (32-Bit-Hexadezimalzeichenkette) salt = os.urandom(16).hex() # Verketten Sie das Passwort und den Salt-Wert combined = password + salt # Verwenden Sie den SHA - 256-Hash-Algorithmus, um den Hash-Wert der verketteten Zeichenkette zu berechnen hashed = hashlib.sha256(combined.encode()).hexdigest() return salt, hashed # Passwortverifikationsfunktion def verify_password(password, salt, hashed_password): # Verketten Sie das eingegebene Passwort und den Salt-Wert, der aus der Datenbank abgerufen wurde combined = password + salt # Berechnen Sie den Hash-Wert der verketteten Zeichenkette new_hash = hashlib.sha256(combined.encode()).hexdigest() # Vergleichen Sie, ob der berechnete Hash-Wert mit dem in der Datenbank gespeicherten Hash-Wert übereinstimmt return new_hash == hashed_password # Verarbeiten Sie das Passwort während der Registrierung password = "user_password" salt, hashed_password = salted_hash(password) print("Salt-Wert:", salt) print("Salted Hash-Wert:", hashed_password) # Überprüfen Sie das Passwort während der Anmeldung input_password = "user_password" is_valid = verify_password(input_password, salt, hashed_password) print("Ergebnis der Passwortverifizierung:", is_valid)
Implementierungsszenarien
Die Salting-Technologie wird hauptsächlich im Szenario der Benutzerkennwortspeicherung eingesetzt. Wenn sich ein Benutzer registriert, generiert das System einen zufälligen Salt-Wert, mischt ihn mit dem vom Benutzer eingegebenen Passwort und führt dann eine Hash-Verarbeitung durch und speichert den Salt-Wert und den Hash-Wert in der Datenbank. Wenn sich der Benutzer anmeldet, ruft das System den Salt-Wert aus der Datenbank ab, mischt ihn mit dem vom Benutzer eingegebenen Passwort und führt dann erneut eine Hash-Verarbeitung durch. Durch den Vergleich des neu generierten Hash-Werts mit dem Hash-Wert in der Datenbank wird die Richtigkeit des Kennworts überprüft und Brute-Force-Cracking- und Rainbow-Table-Angriffen wirksam widerstanden.
V. Auswahl und Anwendung von Verschlüsselungsmethoden
In der tatsächlichen Internetentwicklung erfordert die Wahl der geeigneten Verschlüsselungsmethode eine umfassende Berücksichtigung des Anwendungsszenarios und der Sicherheitsanforderungen:
- Datentransmissionsszenario: Für die Übertragung einer großen Datenmenge sollten vorzugsweise symmetrische Verschlüsselungsalgorithmen (wie AES) zur Datenverschlüsselung verwendet werden, und gleichzeitig sollten asymmetrische Verschlüsselungsalgorithmen (wie RSA) verwendet werden, um den Schlüsselaustausch abzuschließen, um ein Gleichgewicht zwischen Sicherheit und Effizienz zu erreichen.
- Passwortspeicherszenario: Verwenden Sie die Salting-Technologie in Kombination mit einer sicheren Hash-Funktion (wie SHA - 256), um Passwörter zu verarbeiten, und vermeiden Sie die Verwendung von Hash-Funktionen mit geringerer Sicherheit wie MD5, um das Auslaufen von Passwörtern zu verhindern.
- Szenario zur Überprüfung der Datenintegrität: Verwenden Sie Hash-Funktionen wie SHA - 256, um die Daten zu hashen und Hash-Werte zu generieren, um zu überprüfen, ob die Daten manipuliert wurden.
- Digitales Signaturszenario: Verwenden Sie asymmetrische Verschlüsselungsalgorithmen (wie RSA) für digitale Signaturen, um die Integrität und Authentizität der Daten zu gewährleisten.
Die Verschlüsselungstechnologie in der Internetentwicklung ist eine wichtige Verteidigungslinie für die Gewährleistung der Datensicherheit. Entwickler sollten Verschlüsselungsalgorithmen entsprechend den verschiedenen Szenarien sinnvoll auswählen und das Verschlüsselungsschema durch die Kombination von Technologien wie Salting kontinuierlich optimieren. Gleichzeitig sollten sie die neuesten Forschungsergebnisse in der Verschlüsselungstechnologie beachten, um mit den immer komplexeren Netzwerksicherheitsbedrohungen umzugehen und die Sicherheit und Stabilität der digitalen Welt zu gewährleisten.
Leapcell: Das Beste aus Serverless Webhosting
Schließlich möchte ich eine Plattform empfehlen, die sich am besten für die Bereitstellung von Webdiensten eignet, Leapcell
🚀 Bauen Sie mit Ihrer Lieblingssprache
Entwickeln Sie mühelos in JavaScript, Python, Go oder Rust.
🌍 Stellen Sie unbegrenzt Projekte kostenlos bereit
Zahlen Sie nur für das, was Sie nutzen—keine Anfragen, keine Gebühren.
⚡ Pay-as-You-Go, keine versteckten Kosten
Keine Leerlaufgebühren, nur nahtlose Skalierbarkeit.
📖 Entdecken Sie unsere Dokumentation
🔹 Folgen Sie uns auf Twitter: @LeapcellHQ