Grundlegender Unterschied zwischen Hashing- und Verschlüsselungsalgorithmen

509

Ich sehe viel Verwirrung zwischen Hashes und Verschlüsselungsalgorithmen und würde gerne weitere Expertenratschläge zu folgenden Themen erhalten:

  1. Wann werden Hashes oder Verschlüsselungen verwendet?

  2. Was unterscheidet einen Hash- oder Verschlüsselungsalgorithmus (von einer theoretischen / mathematischen Ebene), dh was macht Hashes irreversibel (ohne Hilfe eines Regenbogenbaums)?

Hier sind einige ähnliche SO-Fragen, die nicht so detailliert waren, wie ich gesucht habe:

Was ist der Unterschied zwischen Verschleierung, Hashing und Verschlüsselung?
Unterschied zwischen Verschlüsselung und Hashing

Kenny Cason
quelle
28
Ich kann mir vorstellen, dass dies die Frage ist, auf die sich Menschen beziehen, wenn sie die Begriffe verwechseln. :)
Adam Paynter
18
Hashing ist eine Möglichkeit (kann nicht zurückgesetzt werden), Verschlüsselung ist in beide Richtungen (kann entschlüsselt werden)
Bests
Hashes sind auch nützlich, um große Strukturen und Objekte, z. B. Dateien, zu indizieren. Siehe Hash-Tabelle .
HABO
22
Hashing ist wie ein Fleischwolf. Sie können eine Kuh zum Hamburger machen, aber nicht umgekehrt.
Neil McGuigan
Ich habe festgestellt, dass meine Frage bearbeitet wurde. Ich hatte immer die Unterschiede auf der obersten Ebene zwischen den beiden gekannt, war aber neugieriger auf Unterschiede auf niedriger Ebene / in der Mathematik. :) So oder so, viele gute Inhalte für SO! Danke vielmals!
Kenny Cason

Antworten:

738

Nun, Sie könnten es in Wikipedia nachschlagen ... Aber da Sie eine Erklärung wünschen, werde ich hier mein Bestes geben:

Hash-Funktionen

Sie bieten eine Zuordnung zwischen einer Eingabe beliebiger Länge und einer Ausgabe (normalerweise) fester Länge (oder kleinerer Länge). Dies kann alles sein, von einem einfachen crc32 bis zu einer vollständigen kryptografischen Hash-Funktion wie MD5 oder SHA1 / 2/256/512. Der Punkt ist, dass es eine Einweg-Zuordnung gibt. Es ist immer eine Zuordnung von vielen: 1 (was bedeutet, dass es immer Kollisionen gibt), da jede Funktion eine kleinere Ausgabe erzeugt, als sie eingeben kann (Wenn Sie jede mögliche 1-MB-Datei in MD5 einspeisen, erhalten Sie eine Menge Kollisionen).

Der Grund, warum sie schwer (oder praktisch unmöglich) umzukehren sind, liegt darin, wie sie intern arbeiten. Die meisten kryptografischen Hash-Funktionen durchlaufen den Eingabesatz viele Male, um die Ausgabe zu erzeugen. Wenn wir uns also jeden Teil der Eingabe mit fester Länge ansehen (der vom Algorithmus abhängig ist), ruft die Hash-Funktion diesen aktuellen Status auf. Es wird dann den Status durchlaufen und in einen neuen ändern und diesen als Rückmeldung in sich selbst verwenden (MD5 führt dies 64 Mal für jeden 512-Bit-Datenblock durch). Es kombiniert dann irgendwie die resultierenden Zustände aus all diesen Iterationen wieder zusammen, um den resultierenden Hash zu bilden.

Wenn Sie nun den Hash dekodieren möchten, müssen Sie zunächst herausfinden, wie der angegebene Hash in seine iterierten Zustände aufgeteilt werden kann (1 Möglichkeit für Eingaben, die kleiner als die Größe eines Datenblocks sind, viele für größere Eingaben). Dann müssten Sie die Iteration für jeden Zustand umkehren. Nun, zu erklären , warum dies ist sehr schwer, sich vorstellen , versuchen abzuleiten aund baus der folgenden Formel: 10 = a + b. Es gibt 10 positive Kombinationen von aund bdas kann funktionieren. Führen Sie dies nun einige Male durch:tmp = a + b; a = b; b = tmp. Für 64 Iterationen hätten Sie über 10 ^ 64 Möglichkeiten, es zu versuchen. Und das ist nur eine einfache Ergänzung, bei der ein Zustand von Iteration zu Iteration erhalten bleibt. Echte Hash-Funktionen führen viel mehr als eine Operation aus (MD5 führt ungefähr 15 Operationen mit 4 Zustandsvariablen aus). Und da die nächste Iteration vom Status der vorherigen abhängt und die vorherige beim Erstellen des aktuellen Status zerstört wird, ist es so gut wie unmöglich, den Eingabestatus zu bestimmen, der zu einem bestimmten Ausgabezustand geführt hat (für jede Iteration nicht weniger). Kombinieren Sie dies mit der großen Anzahl von Möglichkeiten, und das Decodieren selbst eines MD5 wird eine nahezu unendliche (aber nicht unendliche) Menge an Ressourcen erfordern. So viele Ressourcen, dass es '

Verschlüsselungsfunktionen

Sie bieten eine 1: 1-Zuordnung zwischen einer Eingabe und Ausgabe beliebiger Länge. Und sie sind immer reversibel. Das Wichtigste ist, dass es mit einer Methode reversibel ist. Und für einen bestimmten Schlüssel ist es immer 1: 1. Jetzt gibt es mehrere Eingabe: Schlüsselpaare, die möglicherweise dieselbe Ausgabe erzeugen (tatsächlich gibt es diese normalerweise, abhängig von der Verschlüsselungsfunktion). Gute verschlüsselte Daten sind nicht von zufälligem Rauschen zu unterscheiden. Dies unterscheidet sich von einer guten Hash-Ausgabe, die immer ein konsistentes Format hat.

Anwendungsfälle

Verwenden Sie eine Hash-Funktion, wenn Sie einen Wert vergleichen möchten, die einfache Darstellung jedoch nicht speichern können (aus einer Reihe von Gründen). Passwörter sollten sehr gut zu diesem Anwendungsfall passen, da Sie sie aus Sicherheitsgründen nicht im Klartext speichern möchten (und sollten). Aber was ist, wenn Sie ein Dateisystem auf Raubkopien von Musikdateien überprüfen möchten? Es wäre unpraktisch, 3 MB pro Musikdatei zu speichern. Nehmen Sie stattdessen den Hash der Datei und speichern Sie diesen (md5 würde 16 Bytes anstelle von 3 MB speichern). Auf diese Weise müssen Sie nur jede Datei hashen und mit der gespeicherten Datenbank mit Hashes vergleichen (dies funktioniert in der Praxis aufgrund von Neucodierung, Ändern von Dateikopfzeilen usw. nicht so gut, ist jedoch ein Beispiel für einen Anwendungsfall).

Verwenden Sie eine Hash-Funktion, wenn Sie die Gültigkeit der Eingabedaten überprüfen. Dafür sind sie konzipiert. Wenn Sie zwei Eingabeteile haben und überprüfen möchten, ob diese identisch sind, führen Sie beide über eine Hash-Funktion aus. Die Wahrscheinlichkeit einer Kollision ist für kleine Eingabegrößen astronomisch gering (unter der Annahme einer guten Hash-Funktion). Deshalb wird es für Passwörter empfohlen. Für Passwörter mit bis zu 32 Zeichen hat md5 das 4-fache des Ausgaberaums. SHA1 hat das 6-fache des Ausgaberaums (ungefähr). SHA512 hat ungefähr das 16-fache des Ausgaberaums. Es ist dir egal, wie das Passwort lautete , es ist dir egal, ob es das gleiche ist wie das, das gespeichert wurde. Deshalb sollten Sie Hashes für Passwörter verwenden.

Verwenden Sie die Verschlüsselung immer dann, wenn Sie die Eingabedaten wieder herausholen möchten. Beachten Sie das Wort brauchen . Wenn Sie Kreditkartennummern speichern, müssen Sie diese irgendwann wieder herausholen, möchten sie aber nicht im Klartext speichern. Speichern Sie stattdessen die verschlüsselte Version und bewahren Sie den Schlüssel so sicher wie möglich auf.

Hash-Funktionen eignen sich auch hervorragend zum Signieren von Daten. Wenn Sie beispielsweise HMAC verwenden, signieren Sie ein Datenelement, indem Sie einen Hash der Daten verwenden, die mit einem bekannten, aber nicht übertragenen Wert (einem geheimen Wert) verknüpft sind. Sie senden also den Klartext und den HMAC-Hash. Dann hasht der Empfänger einfach die gesendeten Daten mit dem bekannten Wert und prüft, ob sie mit dem übertragenen HMAC übereinstimmen. Wenn es dasselbe ist, wissen Sie, dass es nicht von einer Partei ohne den geheimen Wert manipuliert wurde. Dies wird häufig in sicheren Cookie-Systemen von HTTP-Frameworks sowie bei der Nachrichtenübertragung von Daten über HTTP verwendet, wenn Sie die Integrität der Daten sicherstellen möchten.

Ein Hinweis zu Hashes für Passwörter:

Ein wesentliches Merkmal kryptografischer Hash-Funktionen ist, dass sie sehr schnell zu erstellen und sehr schwer / langsam umzukehren sind (so sehr, dass dies praktisch unmöglich ist). Dies wirft ein Problem mit Passwörtern auf. Wenn Sie speichern sha512(password), tun Sie nichts, um sich vor Regenbogentischen oder Brute-Force-Angriffen zu schützen. Denken Sie daran, dass die Hash-Funktion auf Geschwindigkeit ausgelegt ist. Daher ist es für einen Angreifer trivial, einfach ein Wörterbuch über die Hash-Funktion auszuführen und jedes Ergebnis zu testen.

Das Hinzufügen eines Salzes hilft, da es dem Hash ein paar unbekannte Daten hinzufügt. Anstatt also etwas zu finden, das passt md5(foo), müssen sie etwas finden, das, wenn es dem bekannten Salz zugesetzt wird, produziert md5(foo.salt)(was sehr viel schwieriger ist). Aber es löst das Geschwindigkeitsproblem immer noch nicht, denn wenn sie das Salz kennen, ist es nur eine Frage des Durchlaufens des Wörterbuchs.

Es gibt also Möglichkeiten, damit umzugehen. Eine beliebte Methode ist die Schlüsselverstärkung (oder Schlüsseldehnung). Grundsätzlich iterieren Sie viele Male über einen Hash (normalerweise Tausende). Dies macht zwei Dinge. Erstens verlangsamt es die Laufzeit des Hashing-Algorithmus erheblich. Zweitens erhöht eine korrekte Implementierung (Weitergabe der Eingabe und des Salzes bei jeder Iteration) tatsächlich die Entropie (verfügbarer Speicherplatz) für die Ausgabe, wodurch die Wahrscheinlichkeit von Kollisionen verringert wird. Eine triviale Implementierung ist:

var hash = password + salt;
for (var i = 0; i < 5000; i++) {
    hash = sha512(hash + password + salt);
}

Es gibt andere Standardimplementierungen wie PBKDF2 , BCrypt . Diese Technik wird jedoch von einigen sicherheitsrelevanten Systemen (wie PGP, WPA, Apache und OpenSSL) verwendet.

Das Endergebnis hash(password)ist nicht gut genug. hash(password + salt)ist besser, aber immer noch nicht gut genug ... Verwenden Sie einen gestreckten Hash-Mechanismus, um Ihre Passwort-Hashes zu erstellen ...

Ein weiterer Hinweis zum trivialen Dehnen

Führen Sie die Ausgabe eines Hashs unter keinen Umständen direkt in die Hash-Funktion zurück :

hash = sha512(password + salt); 
for (i = 0; i < 1000; i++) {
    hash = sha512(hash); // <-- Do NOT do this!
}

Der Grund dafür liegt in Kollisionen. Denken Sie daran, dass alle Hash-Funktionen Kollisionen aufweisen, da der mögliche Ausgaberaum (die Anzahl der möglichen Ausgaben) kleiner als der Eingaberaum ist. Um zu sehen warum, schauen wir uns an, was passiert. Nehmen wir vorab an, dass die Wahrscheinlichkeit einer Kollision bei 0,001% liegt sha1()( in der Realität ist sie viel geringer, aber zu Demonstrationszwecken).

hash1 = sha1(password + salt);

Hat jetzt hash1eine Kollisionswahrscheinlichkeit von 0,001%. Aber wenn wir das nächste Mal machen hash2 = sha1(hash1);, werden alle Kollisionen von hash1automatisch zu Kollisionen vonhash2 . Jetzt haben wir eine Hash1-Rate von 0,001%, und der zweite sha1()Aufruf trägt dazu bei. Hat jetzt hash2also eine Kollisionswahrscheinlichkeit von 0,002%. Das sind doppelt so viele Chancen! Jede Iteration fügt 0.001%dem Ergebnis eine weitere Kollisionswahrscheinlichkeit hinzu. Bei 1000 Iterationen stieg die Kollisionswahrscheinlichkeit von trivialen 0,001% auf 1%. Jetzt ist die Verschlechterung linear und die realen Wahrscheinlichkeiten sind weitaus geringer, aber der Effekt ist der gleiche (eine Schätzung der Wahrscheinlichkeit einer einzelnen Kollision mit md5beträgt ungefähr 1 / (2 128 ) oder 1 / (3x10 38)). Das scheint zwar klein zu sein, aber dank des Geburtstagsangriffs ist es nicht wirklich so klein, wie es scheint.

Stattdessen führen Sie durch erneutes Anhängen von Salt und Kennwort jedes Mal Daten wieder in die Hash-Funktion ein. Kollisionen einer bestimmten Runde sind also keine Kollisionen der nächsten Runde mehr. Damit:

hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
    hash = sha512(hash + password + salt);
}

Hat die gleiche Kollisionswahrscheinlichkeit wie die native sha512Funktion. Welches ist was du willst. Verwenden Sie das stattdessen.

ircmaxell
quelle
30
Schade, dass die Programmierer bei LinkedIn dies nicht gelesen haben, bevor sie Passwörter als ungesalzene SHA1-Hashes gespeichert haben ... money.cnn.com/2012/06/06/technology/linkedin-password-hack/…
Eric J.
2
@ Pacerier: Es wird auch ein wenig Wert auf Hashing gelegt. Es geht speziell auf Passwort-Hashing ...
ircmaxell
1
Ich verstehe nicht, wie es 1 zu 1 Mapping sein kann, wenn es mehrere Schlüssel geben kann, die zur gleichen Ausgabe führen. Für DES beträgt die Schlüssellänge 56 Bit und die Blockgrößen 64 Bit. Gibt es nicht 256 verschiedene Schlüssel, die demselben Ausgabeblock zugeordnet werden können?
MrQWERTY
1
@ Renren29 ja. Du hast Recht. In der Praxis ist die gesamte Chiffre weder surjektiv noch injektiv. Für einen bestimmten Schlüssel ist er jedoch surjektiv (jeder Klartext hat genau einen Chiffretext), aber nicht unbedingt injektiv (nicht jeder mögliche Chiffretext hat eine Zuordnung zurück). Deshalb habe ich gesagt, dass es für einen bestimmten Schlüssel immer 1: 1 ist . Wenn es nicht mehrere Schlüssel gäbe, die an denselben Ausgabeblock ausgegeben werden könnten, wäre die Chiffre nicht nützlich, da der Chiffretext Ihnen etwas über den Schlüssel sagen würde (ohne es zu wissen).
Ircmaxell
7
Gute Antwort. Mein einziger Trottel ist, dass die Verschlechterung der trivialen Dehnung nicht linear sein kann oder irgendwann 100% passieren würde. Ich denke, in Ihrem Beispiel mit 0,001% sollte der zweite Schritt 0,001 + (1 - 0,001) * 0,001 oder 0,001999 sein.
AlexDev
160

Eine Hash-Funktion kann als das gleiche wie das Backen eines Brotlaibs angesehen werden. Sie beginnen mit Eingaben (Mehl, Wasser, Hefe usw.) und nach Anwendung der Hash-Funktion (Mischen + Backen) erhalten Sie eine Ausgabe: einen Laib Brot.

Der andere Weg ist außerordentlich schwierig - man kann das Brot nicht wirklich wieder in Mehl, Wasser, Hefe trennen - ein Teil davon ging während des Backvorgangs verloren, und man kann nie genau sagen, für wie viel Wasser, Mehl oder Hefe verwendet wurde ein besonderes Brot, weil diese Informationen durch die Hashing-Funktion (auch bekannt als der Ofen) zerstört wurden.

Viele verschiedene Varianten von Inputs produzieren theoretisch identische Brote (z. B. produzieren 2 Tassen Wasser und 1 EL Hefe genau das gleiche Brot wie 2,1 Tassen Wasser und 0,9 EL Hefe), aber bei einem dieser Brote kann man es nicht sagen genau welche Kombination von Eingaben es produzierte.

Die Verschlüsselung kann dagegen als Safe angesehen werden. Was auch immer Sie dort hineinstecken, kommt wieder heraus, solange Sie den Schlüssel besitzen, mit dem es überhaupt verschlossen wurde. Es ist eine symmetrische Operation. Mit einem Schlüssel und einer Eingabe erhalten Sie eine bestimmte Ausgabe. Bei dieser Ausgabe und derselben Taste erhalten Sie die ursprüngliche Eingabe zurück. Es ist eine 1: 1-Zuordnung.

Marc B.
quelle
2
Abgesehen davon, dass man nicht leicht zeigen kann, dass ein bestimmter Hamburger vollständig von einer bestimmten Kuh stammt, was eine grundlegende Eigenschaft eines Hash ist. Es ist also eine lustige Idee, aber eine schreckliche Analogie.
user467257
1
@caf lol in der Tat und ein Klassiker dazu. Die Kuh schafft es jedoch kaum auf den Markt, es ist der "Bulle", der es tut ;-) Kuh: Milch. Stier: Fleisch.
Funk Forty Niner
1
Diese Geschichte dahinter klingt super lecker.
Sitilge
44

Verwenden Sie Hashes, wenn Sie nicht in der Lage sein möchten, die ursprüngliche Eingabe wiederherzustellen, und verwenden Sie dann die Verschlüsselung.

Hashes nehmen einige Eingaben und wandeln sie in einige Bits um (normalerweise als Zahl gedacht, wie eine 32-Bit-Ganzzahl, eine 64-Bit-Ganzzahl usw.). Dieselbe Eingabe erzeugt immer denselben Hash, aber Sie verlieren dabei PRINZIPAL Informationen, sodass Sie die ursprüngliche Eingabe nicht zuverlässig reproduzieren können (dies weist jedoch einige Einschränkungen auf).

Bei der Verschlüsselung bleiben im Wesentlichen alle Informationen erhalten, die Sie in die Verschlüsselungsfunktion eingegeben haben. Sie erschweren es nur (im Idealfall unmöglich), zur ursprünglichen Eingabe zurückzukehren, ohne einen bestimmten Schlüssel zu besitzen.

Einfaches Beispiel für Hashing

Hier ist ein einfaches Beispiel, um Ihnen zu helfen, zu verstehen, warum Hashing (im allgemeinen Fall) die ursprüngliche Eingabe nicht zurückerhalten kann. Angenommen, ich erstelle einen 1-Bit-Hash. Meine Hash-Funktion verwendet eine Bitfolge als Eingabe und setzt den Hash auf 1, wenn in der Eingabezeichenfolge eine gerade Anzahl von Bits gesetzt ist, andernfalls auf 0, wenn eine ungerade Zahl vorhanden ist.

Beispiel:

Input    Hash
0010     0
0011     1
0110     1
1000     0

Beachten Sie, dass es viele Eingabewerte gibt, die zu einem Hash von 0 führen, und viele, die zu einem Hash von 1 führen. Wenn Sie wissen, dass der Hash 0 ist, können Sie nicht sicher wissen, was die ursprüngliche Eingabe war.

Übrigens ist dieser 1-Bit-Hash nicht genau erfunden ... sehen Sie sich das Paritätsbit an .

Einfaches Beispiel für die Verschlüsselung

Sie können Text mit einer einfachen Buchstabensubstitution verschlüsseln. Wenn die Eingabe A ist, schreiben Sie B. Wenn die Eingabe B ist, schreiben Sie C. Bis zum Ende des Alphabets. Wenn die Eingabe Z ist, sind Sie schreibe noch einmal A.

Input   Encrypted
CAT     DBU
ZOO     APP

Genau wie das einfache Hash-Beispiel wurde diese Art der Verschlüsselung in der Vergangenheit verwendet .

Eric J.
quelle
Es ist erwähnenswert, dass sich "Verschlüsselung" umgangssprachlich auf starke Verschlüsselung bezieht und nicht mit schwacher Verschlüsselung wie der Caesar-Chiffre im obigen Beispiel verwechselt werden sollte.
Fax
@Fax Ja, aber was eine starke Verschlüsselung ausmacht, war im Laufe der Jahrhunderte eine bewegliche Leiste. Die deutsche Enigma-Maschine des Zweiten Weltkriegs war fast unmöglich zu knacken (es gibt einen großartigen Film darüber). Heute könnte Ihre Smartwatch es leicht knacken. DES wurde einst als stark angesehen, ebenso wie MD5. Die heutige starke Verschlüsselung droht in absehbarer Zeit leicht den Quantencomputertechniken zum Opfer zu fallen.
Eric J.
Auf jeden Fall, und es ist immer eine gute Idee, die Daten von Posts und Artikeln zu überprüfen, die Ratschläge zur Kryptographie geben. Davon abgesehen bin ich mir ziemlich sicher, dass die Caesar-Chiffre auch 2011 als schwach angesehen wurde.
Fax
39

Grundlegende Übersicht über Hashing- und Verschlüsselungs- / Entschlüsselungstechniken sind.

Hashing:

Wenn Sie Hash jeden Klartext wieder Sie können nicht den gleichen Klartext von Hash - Text bekommen . Es ist einfach ein Einbahnstraßenprozess.

Hashing


Verschlüsselung und Entschlüsselung:

Wenn Sie verschlüsseln jeden Klartext mit einem Schlüssel wieder Sie können gleichen Klartext erhalten , indem Sie Entschlüsselung auf verschlüsselten Text mit dem gleich (symetrisch) / diffrent (asymentric) drücken.

Verschlüsselung und Entschlüsselung


UPDATE: Um die in der bearbeiteten Frage genannten Punkte anzusprechen.

1. Wann werden Hashes oder Verschlüsselungen verwendet?

Hashing ist nützlich, wenn Sie jemandem eine Datei senden möchten. Sie befürchten jedoch, dass jemand anderes die Datei abfängt und ändert. Der Empfänger kann also sicherstellen, dass es sich um die richtige Datei handelt, wenn Sie den Hash-Wert öffentlich veröffentlichen. Auf diese Weise kann der Empfänger den Hashwert der empfangenen Datei berechnen und prüfen, ob er mit dem Hashwert übereinstimmt.

Die Verschlüsselung ist gut, wenn Sie sagen, dass Sie eine Nachricht an jemanden senden möchten. Sie verschlüsseln die Nachricht mit einem Schlüssel und der Empfänger entschlüsselt sie mit demselben (oder möglicherweise sogar einem anderen) Schlüssel, um die ursprüngliche Nachricht zurückzugewinnen. Credits


2. Was unterscheidet einen Hash- oder Verschlüsselungsalgorithmus (von einer theoretischen / mathematischen Ebene), dh was macht Hashes irreversibel (ohne Hilfe eines Regenbogenbaums)?

Grundsätzlich ist Hashing eine Operation, bei der Informationen verloren gehen, jedoch keine Verschlüsselung . Schauen wir uns den Unterschied auf einfache mathematische Weise an, um unser Verständnis zu erleichtern. Natürlich haben beide eine viel kompliziertere mathematische Operation mit Wiederholungen

Verschlüsselung / Entschlüsselung (reversibel):

Ergänzung :

4 + 3 = 7  

Dies kann umgekehrt werden, indem die Summe genommen und einer der Addenden subtrahiert wird

7 - 3 = 4     

Multiplikation :

4 * 5 = 20  

Dies kann umgekehrt werden, indem das Produkt genommen und durch einen der Faktoren dividiert wird

20 / 4 = 5    

Hier könnten wir also annehmen, dass einer der Addenden / Faktoren ein Entschlüsselungsschlüssel ist und das Ergebnis (7,20) ein verschlüsselter Text ist.


Hashing (nicht umkehrbar):

Modulo Division :

22 % 7 = 1   

Dies kann nicht rückgängig gemacht werden, da Sie keine Operation mit dem Quotienten und der Dividende ausführen können, um den Divisor wiederherzustellen (oder umgekehrt).

Können Sie eine Operation finden, in die Sie das '?' ist?

1  ?  7 = 22  
1  ?  22 = 7

Hash-Funktionen haben also die gleiche mathematische Qualität wie die Modulo-Division und verlieren die Informationen.

Credits

mrsrinivas
quelle
26

Mein Einzeiler ... im Allgemeinen wollte der Interviewer die folgende Antwort.

Hashing ist eine Möglichkeit. Sie können Ihre Daten / Zeichenfolge nicht aus einem Hash-Code konvertieren.

Die Verschlüsselung erfolgt in zwei Richtungen: Sie können die verschlüsselte Zeichenfolge erneut entschlüsseln, wenn Sie den Schlüssel bei sich haben.

Shiv Mohan
quelle
Hallo! Das sind zwei Zeilen.
Mark Storer
17

Eine Hash-Funktion wandelt eine Textmenge variabler Größe in einen Text fester Größe um.

Hash

Quelle: https://en.wikipedia.org/wiki/Hash_function


Hash-Funktionen in PHP

Ein Hash verwandelt eine Zeichenfolge in eine Hash-Zeichenfolge. Siehe unten.

HASH:

$str = 'My age is 29';
$hash = hash('sha1', $str);
echo $hash; // OUTPUT: 4d675d9fbefc74a38c89e005f9d776c75d92623e

Passwörter werden normalerweise in ihrer Hash-Darstellung als lesbarer Text gespeichert. Wenn ein Endbenutzer Zugriff auf eine mit einem Kennwort geschützte Anwendung erhalten möchte, muss während der Authentifizierung ein Kennwort angegeben werden. Wenn der Benutzer sein Passwort übermittelt, erhält das gültige Authentifizierungssystem das Passwort und hasht dieses angegebene Passwort. Dieser Passwort-Hash wird mit dem dem System bekannten Hash verglichen. Der Zugang wird bei Gleichstellung gewährt.

DEHASH:

SHA1 ist ein One-Way-Hash. Was bedeutet, dass Sie den Hash nicht enthaupten können.

Sie können den Hash jedoch brutal erzwingen. Bitte sehen Sie: https://hashkiller.co.uk/sha1-decrypter.aspx .

MD5 ist ein weiterer Hash. Ein MD5-Dehasher finden Sie auf dieser Website: https://www.md5online.org/ .

Um Brute-Force-Angriffe auf Hashes zu verhindern, kann ein Salz gegeben werden. In PHP können Sie password_hash()einen Passwort-Hash erstellen. Die Funktion password_hash()erzeugt automatisch ein Salz. Verwenden Sie zum Überprüfen eines Kennworts für einen Kennwort-Hash (mit einem Salt) password_verify().

// Invoke this little script 3 times, and it will give you everytime a new hash
$password = '1234';  
$hash = password_hash($password, PASSWORD_DEFAULT);  

echo $hash; 
// OUTPUT 

$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu 

$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u 

$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW

Ein Passwort kann durch mehr als einen Hash dargestellt werden. Wenn Sie das Kennwort mit verschiedenen Kennwort-Hashes überprüfen password_verify(), wird das Kennwort als gültiges Kennwort akzeptiert.

$password = '1234';  

$hash = '$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW';  
var_dump( password_verify($password, $hash) );

// OUTPUT 

boolean true 

boolean true 

boolean true




Eine Verschlüsselungsfunktion wandelt einen Text mithilfe eines Verschlüsselungsschlüssels in einen unsinnigen Chiffretext um und umgekehrt. Geben Sie hier die Bildbeschreibung ein

Quelle: https://en.wikipedia.org/wiki/Encryption


Verschlüsselung in PHP

Lassen Sie uns in einen PHP-Code eintauchen, der die Verschlüsselung handhabt.

--- Die Mcrypt-Erweiterung ---

VERSCHLÜSSELN:

$cipher = MCRYPT_RIJNDAEL_128;
$key = 'A_KEY';
$data = 'My age is 29';
$mode = MCRYPT_MODE_ECB;

$encryptedData = mcrypt_encrypt($cipher, $key , $data , $mode);
var_dump($encryptedData);

//OUTPUT:
string '„Ùòyªq³¿ì¼üÀpå' (length=16)

DECRYPT:

$decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode);
$decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END
var_dump($decryptedData);

//OUTPUT:
string 'My age is 29' (length=12)

--- Die OpenSSL-Erweiterung ---

Die Mcrypt-Erweiterung wurde in 7.1 nicht mehr unterstützt. und entfernt in php 7.2. Die OpenSSL-Erweiterung sollte in PHP 7 verwendet werden. Siehe die folgenden Codefragmente:

$key = 'A_KEY';
$data = 'My age is 29';

// ENCRYPT
$encryptedData = openssl_encrypt($data , 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($encryptedData);

// DECRYPT    
$decryptedData = openssl_decrypt($encryptedData, 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($decryptedData);

//OUTPUT
string '4RJ8+18YkEd7Xk+tAMLz5Q==' (length=24)
string 'My age is 29' (length=12)
julianisch
quelle
Beachten Sie, dass PHP mcrypt inzwischen veraltet ist (ich hatte möglicherweise etwas damit zu tun) und dass SHA-1, MD5 und ECB alle als unsicher gelten. A_KEYist kein AES / Rijndael-128-Schlüssel; Es ist ein Passwort, kein Schlüssel.
Maarten Bodewes
@ MaartenBodewes Ja das stimmt. OpenSSL ist jetzt die Modeerscheinung. php.net/manual/en/book.openssl.php
Julian
10

Symmetrische Verschlüsselung:

Symmetrische Verschlüsselung kann auch als gemeinsam genutzter Schlüssel oder gemeinsam genutzte geheime Verschlüsselung bezeichnet werden. Bei der symmetrischen Verschlüsselung wird ein einzelner Schlüssel sowohl zum Ver- als auch zum Entschlüsseln des Datenverkehrs verwendet.

Geben Sie hier die Bildbeschreibung ein

Asymmetrische Verschlüsselung:

Asymmetrische Verschlüsselung wird auch als Kryptographie mit öffentlichem Schlüssel bezeichnet. Die asymmetrische Verschlüsselung unterscheidet sich von der symmetrischen Verschlüsselung hauptsächlich dadurch, dass zwei Schlüssel verwendet werden: einer für die Verschlüsselung und einer für die Entschlüsselung. Der gebräuchlichste asymmetrische Verschlüsselungsalgorithmus ist RSA.

Im Vergleich zur symmetrischen Verschlüsselung ist die asymmetrische Verschlüsselung mit einem hohen Rechenaufwand verbunden und tendenziell viel langsamer. Daher wird es normalerweise nicht zum Schutz von Nutzdaten verwendet. Stattdessen ist seine Hauptstärke die Fähigkeit, einen sicheren Kanal über ein nicht sicheres Medium (z. B. das Internet) einzurichten. Dies wird durch den Austausch öffentlicher Schlüssel erreicht, mit denen nur Daten verschlüsselt werden können. Der komplementäre private Schlüssel, der niemals geteilt wird, wird zum Entschlüsseln verwendet.

Geben Sie hier die Bildbeschreibung ein

Hashing:

Schließlich ist Hashing eine Form der kryptografischen Sicherheit, die sich von der Verschlüsselung unterscheidet. Während die Verschlüsselung ein zweistufiger Prozess ist, mit dem eine Nachricht zuerst verschlüsselt und dann entschlüsselt wird, komprimiert das Hashing eine Nachricht zu einem irreversiblen Wert fester Länge oder Hash. Zwei der häufigsten Hashing-Algorithmen im Netzwerk sind MD5und SHA-1.

Geben Sie hier die Bildbeschreibung ein

Lesen Sie hier mehr: http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/

Vahid Farahmandian
quelle
Entschuldigung, ich bin ein Sicherheitsneuling, aber können Sie die Bedeutung von "normalerweise zum Schutz von Nutzdaten verwendet" bitte näher erläutern?
Abdul
2
@Abdul Asymmetrische Verschlüsselung hat einen hohen Rechenaufwand und wird daher nicht zum Schutz der Daten verwendet, die über ein Netzwerk als Pakete (Nutzdaten) gesendet werden. Stattdessen wird es zum Herstellen einer sicheren Netzwerkverbindung durch Austausch öffentlicher Schlüssel zum Schutz der Daten verwendet.
Glücklicher
5
  1. Verwenden Sie Hashes, wenn Sie nur einen Weg gehen müssen. Beispielsweise verwenden Sie für Kennwörter in einem System Hashing, da Sie immer nur überprüfen, ob der von einem Benutzer nach dem Hashing eingegebene Wert mit dem Wert in Ihrem Repository übereinstimmt. Mit der Verschlüsselung können Sie zwei Wege gehen.

  2. Hashing-Algorithmen und Verschlüsselungsalgorithmen sind nur mathematische Algorithmen. Insofern unterscheiden sie sich nicht - es sind alles nur mathematische Formeln. In Bezug auf die Semantik gibt es jedoch einen sehr großen Unterschied zwischen Hashing (Einweg) und Verschlüsselung (Zweiweg). Warum sind Hashes irreversibel? Weil sie so konzipiert sind, weil Sie manchmal eine Einwegoperation wünschen.

hvgotcodes
quelle
4

Verschlüsselungs- und Hash-Algorithmen funktionieren auf ähnliche Weise. In jedem Fall besteht die Notwendigkeit, Verwirrung und Diffusion zwischen den Bits zu erzeugen . Kocht, Verwirrung ist eine komplexe Beziehung zwischen dem Schlüssel und dem verschlüsselten Text zu schaffen, und die Diffusion breitet sich die Informationen von jedem Bit herum.

Viele Hash-Funktionen verwenden tatsächlich Verschlüsselungsalgorithmen (oder Grundelemente von Verschlüsselungsalgorithmen). Beispielsweise verwendet der SHA-3-Kandidat Skein Threefish als zugrunde liegende Methode zur Verarbeitung jedes Blocks. Der Unterschied besteht darin, dass sie nicht jeden Chiffretextblock behalten, sondern destruktiv sind. deterministisch zu einer festen Länge zusammengeführt

Justin Morgan
quelle
4

Wenn es um die Sicherheit bei der Datenübertragung geht, dh für die bidirektionale Kommunikation, verwenden Sie die Verschlüsselung. Für jede Verschlüsselung ist ein Schlüssel erforderlich

Wenn es um die Autorisierung geht, verwenden Sie Hashing. Es gibt keinen Schlüssel für das Hashing

Hashing verwendet eine beliebige Datenmenge (Binär oder Text) und erstellt einen Hash konstanter Länge, der eine Prüfsumme für die Daten darstellt. Beispielsweise kann der Hash 16 Bytes betragen. Unterschiedliche Hashing-Algorithmen erzeugen Hashes unterschiedlicher Größe. Sie können die Originaldaten natürlich nicht aus dem Hash neu erstellen, aber Sie können die Daten erneut hashen, um festzustellen, ob der gleiche Hashwert generiert wird. Einweg-Unix-basierte Passwörter funktionieren auf diese Weise. Das Kennwort wird als Hashwert gespeichert. Um sich bei einem System anzumelden, wird das von Ihnen eingegebene Kennwort gehasht und der Hashwert mit dem Hash des tatsächlichen Kennworts verglichen. Wenn sie übereinstimmen, müssen Sie das richtige Passwort eingegeben haben

Warum ist Hashing irreversibel?

Hashing ist nicht umkehrbar, da die Eingabe-zu-Hash-Zuordnung nicht 1 zu 1 ist. Wenn zwei Eingaben demselben Hashwert zugeordnet sind, wird dies normalerweise als "Hash-Kollision" bezeichnet. Aus Sicherheitsgründen ist eine der Eigenschaften einer "guten" Hash-Funktion, dass Kollisionen im praktischen Gebrauch selten sind.

Ayush
quelle
1
"Hashing ist nicht umkehrbar, da die Eingabe-zu-Hash-Zuordnung nicht 1-zu-1 ist", danke, ich denke, das ist ein sehr wichtiger Faktor, wenn es darum geht, Hashes von Verschlüsselungen zu unterscheiden! :)
Kenny Cason
Dies unterscheidet nicht klar zwischen normalen Hash-Funktionen, kryptografischen Hash-Funktionen und Passwort-Hashes. Diese haben alle unterschiedliche Eigenschaften.
Maarten Bodewes
-2

Die Kryptographie befasst sich mit Zahlen und Zeichenfolgen. Grundsätzlich sind alle digitalen Dinge im gesamten Universum Zahlen. Wenn ich Zahlen sage, ist es 0 & 1. Sie wissen, was sie sind, binär. Die Bilder, die Sie auf dem Bildschirm sehen, die Musik, die Sie über Ihren Kopfhörer hören, alles sind Binärdateien. Aber unsere Ohren und Augen werden Binärdateien nicht verstehen, oder? Nur das Gehirn kann das verstehen, und selbst wenn es Binärdateien verstehen kann, kann es keine Binärdateien genießen. Also konvertieren wir die Binärdateien in verständliche Formate wie MP3, JPG usw. Nennen wir den Prozess Codierung . Es ist ein Zwei-Wege-Prozess und kann leicht in seine ursprüngliche Form zurück dekodiert werden.

Hashing

Hashing ist eine andere Kryptografietechnik, bei der Daten, die einmal in eine andere Form konvertiert wurden, niemals wiederhergestellt werden können. In Laymans Begriff gibt es keinen Prozess, der als De-Hashing bezeichnet wird . Es gibt viele Hash-Funktionen , um die Arbeit zu erledigen, wie z. B. sha-512, md5 und so weiter.

Wenn der ursprüngliche Wert nicht wiederhergestellt werden kann, wo verwenden wir ihn dann? Passwörter! Wenn Sie ein Passwort für Ihr Handy oder Ihren PC einrichten, wird ein Hash Ihres Passworts erstellt und an einem sicheren Ort gespeichert. Wenn Sie das nächste Mal einen Anmeldeversuch durchführen, wird die eingegebene Zeichenfolge erneut mit demselben Algorithmus (Hash-Funktion) gehasht und die Ausgabe wird mit dem gespeicherten Wert abgeglichen. Wenn es dasselbe ist, werden Sie angemeldet. Andernfalls werden Sie rausgeworfen.

Credits: wikimedia Durch Anwenden von Hash auf das Passwort können wir sicherstellen, dass ein Angreifer unser Passwort niemals erhält, selbst wenn er die gespeicherte Passwortdatei stiehlt. Der Angreifer hat den Hash des Passworts. Er kann wahrscheinlich eine Liste der am häufigsten verwendeten Passwörter finden und sha-512 auf jedes dieser Passwörter anwenden und sie mit dem Wert in seiner Hand vergleichen. Es wird der Wörterbuchangriff genannt . Aber wie lange würde er das tun? Glauben Sie, dass diese Methode zum Knacken funktionieren würde, wenn Ihr Passwort zufällig genug ist? Alle Passwörter in den Datenbanken von Facebook, Google und Amazon sind gehasht oder sollen zumindest gehasht werden.

Dann gibt es Verschlüsselung

Die Verschlüsselung liegt zwischen Hashing und Codierung. Die Codierung ist ein bidirektionaler Prozess und sollte nicht zur Gewährleistung der Sicherheit verwendet werden. Die Verschlüsselung ist ebenfalls ein bidirektionaler Prozess. Originaldaten können jedoch nur dann abgerufen werden, wenn der Verschlüsselungsschlüssel bekannt ist. Wenn Sie nicht wissen, wie Verschlüsselung funktioniert, machen Sie sich keine Sorgen, wir werden die Grundlagen hier besprechen. Das würde ausreichen, um die Grundlagen von SSL zu verstehen. Es gibt also zwei Arten der Verschlüsselung, nämlich die symmetrische und die asymmetrische Verschlüsselung.

Symmetrische Schlüsselverschlüsselung

Ich versuche die Dinge so einfach wie möglich zu halten. Lassen Sie uns also die symmetrische Verschlüsselung mittels eines Verschiebungsalgorithmus verstehen. Dieser Algorithmus wird zum Verschlüsseln von Alphabeten verwendet, indem die Buchstaben nach links oder rechts verschoben werden. Nehmen wir einen String CRYPTO und betrachten eine Zahl +3. Dann ist das verschlüsselte Format von CRYPTO FUBSWR. Das heißt, jeder Buchstabe wird um 3 Stellen nach rechts verschoben. Hier wird das Wort CRYPTO genannt Klartext , der Ausgang FUBSWR wird der angerufene Ciphertext , wird der Wert der angerufene +3 ist Verschlüsselungsschlüssel (symmetrische Schlüssel) und der gesamte Prozess ist eine Chiffre . Dies ist einer der ältesten und grundlegendsten Verschlüsselungsalgorithmen für symmetrische Schlüssel, und seine erste Verwendung wurde während der Zeit von Julius Caesar gemeldet. Es wurde also nach ihm benannt und ist die berühmte Caesar-Chiffre . Jeder, der den Verschlüsselungsschlüssel kennt und die Umkehrung des Caesar-Algorithmus anwenden und den ursprünglichen Klartext abrufen kann. Daher wird es als symmetrische Verschlüsselung bezeichnet .

Asymmetrische Schlüsselverschlüsselung

Wir wissen, dass bei der symmetrischen Verschlüsselung derselbe Schlüssel sowohl für die Verschlüsselung als auch für die Entschlüsselung verwendet wird. Sobald dieser Schlüssel gestohlen wurde, sind alle Daten verschwunden. Das ist ein großes Risiko und wir brauchen komplexere Techniken. 1976 veröffentlichten Whitfield Diffie und Martin Hellman erstmals das Konzept der asymmetrischen Verschlüsselung, und der Algorithmus wurde als Diffie-Hellman-Schlüsselaustausch bezeichnet . 1978 veröffentlichten Ron Rivest, Adi Shamir und Leonard Adleman vom MIT den RSA- Algorithmus. Diese können als Grundlage der asymmetrischen Kryptographie angesehen werden.

Im Vergleich zur symmetrischen Verschlüsselung gibt es bei der asymmetrischen Verschlüsselung zwei Schlüssel anstelle von einem. Einer wird als öffentlicher Schlüssel bezeichnet , der andere als privater Schlüssel . Theoretisch können wir während der Initiierung das Public-Private generierenSchlüsselpaar zu unserer Maschine. Der private Schlüssel sollte an einem sicheren Ort aufbewahrt und niemals an Dritte weitergegeben werden. Der öffentliche Schlüssel kann, wie der Name schon sagt, mit jedem geteilt werden, der Ihnen verschlüsselten Text senden möchte. Jetzt können diejenigen, die über Ihren öffentlichen Schlüssel verfügen, die geheimen Daten damit verschlüsseln. Wenn das Schlüsselpaar mithilfe des RSA-Algorithmus generiert wurde, sollten sie beim Verschlüsseln der Daten denselben Algorithmus verwenden. Normalerweise wird der Algorithmus im öffentlichen Schlüssel angegeben. Die verschlüsselten Daten können nur mit dem privaten Schlüssel entschlüsselt werden, der Ihnen gehört.

Quelle: SSL / TLS für Dummies Teil 1: Ciphersuite, Hashing, Verschlüsselung | WST ( https://www.wst.space/ssl-part1-ciphersuite-hashing-encryption/ )

Anonymes Schnabeltier
quelle
-3

Verschlüsselung Der Zweck der Verschlüsselung besteht darin, Daten zu transformieren, um sie geheim zu halten. ZB (Senden Sie jemandem einen geheimen Text, den er nur lesen kann, und senden Sie Passwörter über das Internet).

Anstatt die Benutzerfreundlichkeit zu fokussieren, soll sichergestellt werden, dass die gesendeten Daten geheim gesendet werden können und nur für den Benutzer sichtbar sind, den Sie gesendet haben.

Es verschlüsselt die Daten in ein anderes Format, um sie in ein eindeutiges Muster umzuwandeln. Es kann mit dem geheimen Schlüssel verschlüsselt werden, und Benutzer, die über den geheimen Schlüssel verfügen, können die Nachricht sehen, indem sie den Vorgang umkehren. ZB (AES, BLOWFISH, RSA)

Die Verschlüsselung kann einfach so aussehen: FhQp6U4N28GITVGjdt37hZN

Hashing Technisch kann man sagen, dass es eine willkürliche Eingabe nimmt und eine Zeichenfolge fester Länge erzeugt.

Das Wichtigste dabei ist, dass Sie nicht von der Ausgabe zur Eingabe wechseln können. Es wird die starke Ausgabe erzeugt, dass die angegebenen Informationen nicht geändert wurden. Der Prozess besteht darin, eine Eingabe zu nehmen und sie zu hashen und dann mit dem privaten Schlüssel des Absenders zu senden, sobald der Empfänger sie empfangen hat. Er kann sie mit dem öffentlichen Schlüssel des Absenders validieren.

Wenn der Hash falsch ist und nicht mit dem Hash übereinstimmt, können wir keine Informationen sehen. ZB (MD5, SHA .....)

neevan
quelle