- Eine unidirektionale Viele-zu-Eins-Zuordnung von Input zu Output;
- Basierend auf einer mathematischen Formel;
- Vorbehaltlich erheblicher Leistungsänderungen auch bei geringfügigen Eingangsänderungen;
- Es wird eine lange Zahl mit einer festen Länge ausgegeben;
- Kann die Eingabe eindeutig identifizieren, die Eingabe jedoch nicht preisgeben.
(Hinweis: Hashing-Funktionen sind nicht nur für Kryptografie gedacht. Das oben Gesagte gilt für andere Anwendungsfälle nicht immer zu 100%.) Kryptografisches Hashing ist nicht Verschlüsselung, weil sie nicht umkehrbar sein soll. Sicher, technisch gesehen könnte man Daten in etwas verschlüsseln, das gleich aussieht, und den Schlüssel wegwerfen, aber er könnte trotzdem entschlüsselt werden, wenn jemand irgendwie eine Kopie des Schlüssels hat. Hashing ist stattdessen eher wie ein Fingerabdruck. Ein Fingerabdruck gibt uns nicht den Namen, das Alter, die Größe, das Gewicht oder die Lieblingsfarbe der Person, mit der er verknüpft ist. Ebenso sagt uns ein Message Digest nicht die Länge der Eingabe, ob die Eingabe ein Bild oder Text oder etwas anderes war, ob das Wort FloQast
erscheint in der Eingabe und so weiter. Lassen Sie uns die Nachricht hashen HALLO, WELT!
im macOS-Terminal mit einem 256-Bit-Secure-Hash-Algorithmus (SHA-256
) Aufruf:
% echo -n 'HELLO, WORLD!' | shasum -a 256
b8d28d44584a6440028c72b4c7e774b11331e8f6f3cbae8ed482aef9c27fef74 -
% echo -n 'HELLO, WORLD!' | shasum -a 256
b8d28d44584a6440028c72b4c7e774b11331e8f6f3cbae8ed482aef9c27fef74 -
% echo -n 'HELLO, WORLD!' | shasum -a 256
b8d28d44584a6440028c72b4c7e774b11331e8f6f3cbae8ed482aef9c27fef74 -
Egal wie oft wir einen SHA-256-Digest der Nachricht erstellen, die Ausgabe bleibt dieselbe — sie ist deterministisch. Dies gilt für mehrere Computer und Prozessorarchitekturen. Da die Ausgabelänge fest ist (immer 256 Bit) und weil sie kürzer als die maximal mögliche Eingabelänge ist, führt dieser Determinismus manchmal dazu, dass verschiedene Eingaben dieselbe Ausgabe erzeugen.
Dies ist bekannt als Kollision.Kollisionen können zu allen möglichen Sicherheitslücken führen, von Identitätsmissbrauch und Fälschungen bis hin zu kaputten Quellcodeverwaltungssystemen. Ein guter kryptografischer Hashing-Algorithmus minimiert nicht nur die Wahrscheinlichkeit von Kollisionen, sondern macht sie auch schwer vorhersehbar. Wenn wir unser obiges Beispiel so ändern, dass einer der Buchstaben klein geschrieben wird, können wir sehen, dass sich die Ausgabe völlig geändert hat:
% echo -n 'HeLLO, WORLD!' | shasum -a 256
6ef325dd396b1ce20cf8cc3815c9ceba0a9daaeb835d24f967d363ff65b0a78c -
Es kann zwar eine Kollision zwischen diesen Ausgaben und diesem speziellen Digest-Algorithmus geben, aber wir werden sie wahrscheinlich nicht finden, indem wir einfach Buchstaben austauschen. Da wir nicht effektiv von der Ausgabe zur Eingabe rückwärts arbeiten können, können wir eine Kopie der Ausgabe speichern und sie später verwenden. Wenn wir das für eine Datei statt für eine Zeichenfolge tun, können wir überprüfen, ob sich der Inhalt überhaupt geändert hat:
% echo helloworld > message.txt
% shasum -a 256 message.txt
8cd07f3a5ff98f2a78cfc366c13fb123eb8d29c1ca37c79df190425d5b9e424d message.txt
% echo Helloworld > message.txt
% shasum -a 256 message.txt
733b8d6bf076298654e1aa28d26a47f43f1cc0958476e19fc09444da2e7884de message.txt
Wir können diese Methode nutzen, um festzustellen, ob sich der Inhalt einer Datei geändert hat, z. B. eine Kopie eines Vertrags oder ein wichtiger Teil des Quellcodes. Weil die SHA-Chiffrenfamilie (zusammen mit einigen anderen) so konzipiert ist, schnell, sie eignen sich ideal, um die Integrität von Dateien zu überprüfen, um festzustellen, ob sie manipuliert oder möglicherweise versehentlich beschädigt wurden, z. B. über eine unzuverlässige Netzwerkverbindung.
Vielleicht denken Sie sogar daran, SHA-256 für Passwort-Hashing in einer Datenbank zu verwenden. Das Problem ist, dass es, weil es so schnell ist, nicht viel dazu beiträgt, einen Angreifer daran zu hindern, Klartext-Passwörter zu erhalten. Jeder, der eine Kopie der Datenbank hat, könnte die Hashwerte vorberechnen, sodass jede Zeile mit einem Passwort von herausgefunden werden kann hallo123
in wenigen Mikrosekunden.
Um dem entgegenzuwirken, verwenden Sie einen langsameren Algorithmus oder Schlüsselableitungsfunktion Das speziell für Passwort-Hashing entwickelte System kann dabei helfen, diese Art von Angriffen abzuwehren, ohne legitime Nutzer zu belästigen. In seiner einfachsten Form führen diese Prozesse einfach dazu, dass das Hashing um Größenordnungen länger dauert. Dies verteuert die Vorberechnung in Bezug auf die Zeit erheblich.
Was wäre, wenn wir es auch ermöglichen könnten, dass mehrere Zeilen dasselbe Passwort haben, ohne dass ihre Hashes identisch sind? Geben Sie ein salzen.
Ein Salt ist eine zufällig generierte Datenmenge, die im Rahmen des kryptografischen Hashing-Prozesses vor- oder angehängt und dann zusammen mit dem Passwort gespeichert wird. Es ist kein Geheimnis, überhaupt nicht, und sein Hauptzweck besteht darin, die Vorausberechnung von Hashes unmöglich zu machen. In Kombination mit einer langsameren Hashing-Funktion muss ein Hacker, der eine ganze Datenbank mit Passwörtern knacken will, eine Zeile nach der anderen bearbeiten, möglicherweise sehr langsam. Nehmen wir an, Ihr Salz ist zwei Byte lang:
% echo -n '2sHELLO, WORLD!' | shasum -a 256
da1c8986242f128d2dea484483446b90dfa3a35b613121ca1de76eff68380907 -
% echo -n 'xfHELLO, WORLD!' | shasum -a 256
563f022aee539a070ebec1b1afd4c4e6aaab141ecff2c1886c4982cd084f9bc8 -
Wir stellen die beiden Byte unserer ursprünglichen Zeichenfolge voran HALLO, WELT!
und nutzen Sie, wie drastisch sich die Eingabe ändert. Der einzige Haken ist, dass wir, wenn wir das Haschisch lagern, darauf achten müssen, auch das Salz aufzubewahren!
Es ist jetzt 2020. Vielleicht gibt es eine noch bessere Option: Single Sign-On oder SSO. Dies ermöglicht es einem Dienst, überhaupt keine Passwortdaten zu speichern, sondern sich stattdessen auf eine externe Autorität wie Google, GitHub oder einen Verzeichnisdienst zu verlassen, um die Passwortsicherheit zu gewährleisten. Wenn Sie dann versuchen, sich beim Dienst anzumelden, können Sie die Option wählen, sich mit einem externen Konto anzumelden. Beispielsweise bieten dir viele GitHub-Integrationen die Möglichkeit, dich mit GitHub anzumelden: Wenn du versuchst, dich anzumelden, wirst du zur GitHub-Anmeldeseite weitergeleitet. Sobald Sie sich angemeldet haben, kehren Sie zur Integrationsseite zurück. Sie erhalten niemals eine Kopie Ihres Passworts.
Obwohl wir unseren Kunden sowohl eine passwortbasierte als auch eine SSO-Authentifizierung anbieten, empfiehlt FloqAST allen nachdrücklich, das Verzeichnissystem ihrer eigenen Organisation zu verwenden. Dies beschleunigt das Onboarding, fördert den Self-Service und reduziert die Anzahl der Passwörter, die Benutzer erstellen müssen. Bessere Sicherheit für alle! Ich bin Sicherheitsingenieur hier bei FloQast. Unser Sicherheitsteam deckt alle organisatorischen Funktionen ab, um das Risiko zu managen, dem das Unternehmen ausgesetzt ist. Heute wollte ich über Hashing sprechen, das in einer SaaS-Anwendung mehreren wichtigen kryptografischen Zwecken dienen kann. Beim kryptografischen Hashing werden Daten mathematisch verarbeitet, um eine Ausgabe abzuleiten, die wir als Platzhalter für das Original verwenden können. Bei einer bestimmten Eingabe ist ein Raute (oder verdauen) dieser Eingabe ist im Allgemeinen: