it-swarm-eu.dev

Wie kann festgestellt werden, welche Art von Codierung / Verschlüsselung verwendet wurde?

Gibt es eine Möglichkeit herauszufinden, welche Art von Verschlüsselung/Codierung verwendet wird? Zum Beispiel teste ich eine Webanwendung, die das Passwort in einem verschlüsselten Format (WeJcFMQ/8+8QJ/w0hHh+0g==) In der Datenbank speichert. Wie bestimme ich, welches Hashing oder welche Verschlüsselung verwendet wird?

156
Karthik

Ihre Beispielzeichenfolge (WeJcFMQ/8+8QJ/w0hHh+0g==) ist eine Base64-Codierung für eine Folge von 16 Bytes, die nicht aussagekräftig aussehen ASCII oder UTF-8. If Dies ist ein Wert, der für das Kennwort gespeichert wird. Verifikation (dh nicht wirklich ein "verschlüsseltes" Passwort, sondern ein "Hash" -Passwort), dann ist dies wahrscheinlich das Ergebnis einer über das Passwort berechneten Hash-Funktion, der einen klassischen Hash-Funktion mit einer 128-Bit-Ausgabe ist MD5. Aber es könnte über alles sein.

Der "normale" Weg, dies zu wissen, besteht darin, den Anwendungscode zu betrachten. Anwendungscode wird auf greifbare, fette Weise inkarniert (ausführbare Dateien auf einem Server, Quellcode irgendwo ...), die nicht so geschützt ist und nicht geschützt werden kann wie ein geheimer Schlüssel. Reverse Engineering ist also der "richtige Weg".

Mit Ausnahme des Reverse Engineering können Sie einige Experimente durchführen, um fundierte Vermutungen anzustellen:

  • Wenn derselbe Benutzer sein Passwort "ändert", aber dasselbe wiederverwendet, ändert sich der gespeicherte Wert? Wenn ja, ist ein Teil des Werts wahrscheinlich ein zufälliges "Salz" oder IV (unter der Annahme einer symmetrischen Verschlüsselung).
  • Unter der Annahme, dass der Wert aus dem Kennwort für einen bestimmten Benutzer deterministisch ist, führt dies zu demselben gespeicherten Wert, wenn zwei Benutzer dasselbe Kennwort auswählen? Wenn nein, ist der Benutzername wahrscheinlich Teil der Berechnung. Möglicherweise möchten Sie versuchen, MD5 ("Benutzername: Kennwort") oder andere ähnliche Varianten zu berechnen, um festzustellen, ob Sie eine Übereinstimmung erhalten.
  • Ist die Passwortlänge begrenzt? Wenn Sie nämlich ein 40-stelliges Passwort festlegen und sich nicht erfolgreich authentifizieren können, indem Sie nur die ersten 39 Zeichen eingeben, bedeutet dies, dass alle Zeichen wichtig sind, und dies impliziert, dass dies wirklich ein Passwort ist Hashing, nicht - Verschlüsselung (Der gespeicherte Wert wird zum Überprüfen eines Kennworts verwendet, das Kennwort kann jedoch nicht allein aus dem gespeicherten Wert wiederhergestellt werden.).
140
Thomas Pornin

Bearbeiten: Ich habe gerade ein sehr cooles Skript namens hashID bemerkt. Der Name beschreibt es ziemlich genau.

~~~

Im Allgemeinen ist es so, wie man Dinge macht, um fundierte Vermutungen anzustellen.

Hier ist eine Liste mit einer sehr großen Anzahl von Hash-Ausgaben, damit Sie wissen, wie jede aussieht, und Signaturen/Muster erstellen oder einfach nur optisch überprüfen können.

Es gibt zwei Hauptaspekte , auf die Sie zuerst achten:

  • die Länge des Hashs (jede Hash-Funktion hat eine bestimmte Ausgabelänge)
  • das verwendete Alphabet (sind alle englischen Buchstaben? Zahlen 0-9 und A-F so hexadezimal? Welche Sonderzeichen gibt es, wenn überhaupt?)

Einige Programme zum Knacken von Passwörtern (z. B. John the Ripper) wenden einen Mustervergleich auf die Eingabe an, um den verwendeten Algorithmus zu erraten. Dies funktioniert jedoch nur bei generischen Hashes. Wenn Sie beispielsweise eine Hash-Ausgabe verwenden und jeden Buchstaben um 1 drehen, schlagen die meisten Mustervergleichsschemata fehl.

68
john

Was Sie gepostet haben, sind 16 Bytes (128 Bit) der Basis 64-codierten Daten. Die Tatsache, dass es Base 64-codiert ist, sagt nicht viel aus, da Base 64 kein Verschlüsselungs-/Hashing-Algorithmus ist, sondern eine Möglichkeit, Binärdaten in Text zu codieren. Dies bedeutet, dass dieser Block eine nützliche Information enthält, nämlich dass die Ausgabe 16 Bytes lang ist. Wir können dies mit der Blockgröße häufig verwendeter Schemata vergleichen und herausfinden, was es nicht sein kann. Bei weitem die häufigsten Schemata sind:

Als nächstes müssen wir uns andere Chiffretextblöcke ansehen, um die Antwort auf die folgende Frage herauszufinden:

  • Sind alle Chiffretexte gleich lang, auch für unterschiedliche Eingabelängen?

Wenn nicht alle Blöcke gleich lang sind, handelt es sich nicht um einen Hashing-Algorithmus, sondern um einen Verschlüsselungsalgorithmus. Da die Ausgabe immer ein Vielfaches der zugrunde liegenden Blockgröße ist, würde das Vorhandensein eines Blocks, der nicht gleichmäßig durch 16 Bytes teilbar ist, bedeuten, dass er nicht AES sein kann und daher DES oder 3DES) sein muss.

Wenn Sie die Möglichkeit haben, ein Passwort einzugeben und die Ausgabe zu beobachten, kann dies sehr schnell festgestellt werden. Geben Sie einfach ein 17-stelliges Passwort ein und sehen Sie sich die Länge an. Wenn Sie 16 Byte haben, bedeutet MD5, 20 Byte bedeutet SHA-1, 24 Byte bedeutet DES oder 3DES, 32 Byte bedeutet AES.

26
Yaur

Wenn dies tatsächlich ein einfacher Passwort-Hash ist, können wir möglicherweise verwenden Sie Google, um ihn zu knacken . Base64 ist jedoch mit all diesen Schrägstrichen und Pluszeichen schwer zu suchen. Konvertieren wir also zuerst diesen Hash in hexadezimal:

$ Perl -MMIME::Base64 -le 'print unpack "H*", decode_base64 "WeJcFMQ/8+8QJ/w0hHh+0g=="'
59e25c14c43ff3ef1027fc3484787ed2

OK, jetzt können wir Google dafür . Im Moment bekomme ich nur ein Treffer von md5this.com - obwohl es offensichtlich bald mehr geben wird, einschließlich dieses Beitrags.

Leider (oder vielleicht zum Glück, abhängig von Ihrer Perspektive) haben wir nicht das Glück, tatsächlich ein Vorbild zu finden (die Site listet diesen Hash derzeit als "Cracking ..." auf), aber die Tatsache, dass er überhaupt auf dieser Liste steht, tut dies Es wird dringend empfohlen, dass es sich tatsächlich um einen ungesalzenen MD5-Hash eines echten Passworts handelt.

6
Ilmari Karonen

Dies hängt vom Format ab. Einige Protokolle zum Speichern von verschlüsseltem Text verfügen über einen Klartextabschnitt, der definiert, wie er verschlüsselt wird. In Ihrem Beispiel bin ich zweifelhaft, da die Zeichenfolge, auf die Sie verweisen, so kurz ist, dass es so aussieht, als wäre es nur der verschlüsselte Text.

Ich würde ein paar Gedanken vorschlagen:

  • Das "==" am Ende wäre definitiv ein Auffüllen, also schließen Sie das nicht in Entschlüsselungsversuche ein.

  • Möglicherweise handelt es sich eher um einen Hash oder einen gesalzenen Hash als um eine Verschlüsselung. In diesem Fall funktioniert der Versuch, die Daten zu "entschlüsseln", nicht. Sie müssen Kennwörter mit demselben Hash- und/oder Salt-Wert abgleichen, der ursprünglich verwendet wurde. Mit einem gesalzenen Passwort ist es nicht möglich, den ursprünglichen Wert zu erhalten.

  • Ihre absolut beste Wahl ist es, eine Kopie des Codes zu erhalten, der zum Speichern der Passwörter verwendet wird. Irgendwo dort werden die Passwörter einer kryptografischen Operation unterzogen. Finden Sie den Code, um zu erfahren, was hier passiert. 9 Mal von 10 verwenden sie eine Art API für das Hashing/Salting/Verschlüsselung, und Sie können sie mit derselben API imitieren oder umkehren.

6
bethlakshmi

Die Codierung kann im Allgemeinen erraten werden. Die in Ihrer Frage angegebene Zeichenfolge ist beispielsweise Base64-codiert. Die Gleichheitszeichen werden im Base64-Schema aufgefüllt. Das weiß ich aus Erfahrung.

Wenn Sie mir eine verschlüsselte Zeichenfolge gegeben haben, kann ich Ihnen möglicherweise die Codierung mitteilen, aber ich kann Ihnen den zum Verschlüsseln verwendeten Algorithmus nicht mitteilen, es sei denn, es sind Metadaten verfügbar. Der Grund ist folgender: Verschlüsselungsalgorithmen erzeugen scheinbar zufällige Daten. Wenn ich zwei Sätze mit jeweils zwei Chiffren (vier Ausgaben) verschlüsseln würde, könnten Sie mir nicht mit Sicherheit sagen, welcher Chiffretext zu welcher Chiffre gehört, es sei denn, Sie haben ihn entschlüsselt oder die Chiffre gebrochen.

In Bezug auf Ihre spezifische Instanz werden Passwörter normalerweise gehasht. Das heißt, Sie können das Kennwort nicht aus dem Hash wiederherstellen, aber Sie können testen, ob der Hash mit dem Kennwort übereinstimmt. In dieser Hinsicht ist @ Johns Antwort golden. Wenn Sie ein Kennwort eingeben können, das Sie kennen, und dann allgemeine Schemata dagegen ausprobieren können, können Sie erfahren, welcher Hash verwendet wird.

6
Jeff Ferland

Der einzige Weg ist zu raten. Mit der Erfahrung werden Vermutungen korrekter sein.

Beispiel: Basierend auf der Länge der Ausgabe: Die MD5-Ausgabe beträgt 128 Bit oder 16 Byte, die SHA1-Ausgabe 160 Bit oder 20 Byte. Basierend auf dem Zeichensatz der Ausgabe: BASE64 erzeugt eine Ausgabe mit druckbaren Zeichen.

Letztendlich ist es der Try-and-Error-Ansatz, der Ihnen zeigt, wie.

4
Nam Nguyen

Dies ist eine sehr schwache Sicherheit an allen Fronten! Der Klartext lautet P4 $$ w0rdP4 $$ w0rd und wird mit XOR Verschlüsselung mit dem Schlüssel CdZ4MLMPgYtAE9gQ80gMtg == verschlüsselt vom OP oben veröffentlichter Chiffretext, WeJcFMQ/8 + 8QJ/w0hHh + 0g ==.

Verifizieren:

Verwenden Sie zunächst xxd, um die zugrunde liegende Binärdatei des Klartextes abzurufen:

echo -n 'P4$$w0rdP4$$w0rd' | xxd -b -c16

Dies erzeugt:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100

Als nächstes decodiere base64 den Schlüssel und benutze xxd, um die zugrunde liegende Binärdatei des Schlüssels zu erhalten:

echo -n 'CdZ4MLMPgYtAE9gQ80gMtg==' | base64 -d | xxd -b -c16

Dies erzeugt:

00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110

Nun XOR die beiden Binärzeichenfolgen:

01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100  (plaintext)
[XOR]
00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110  (key)
-----------------------------------------------------------------------------------------------------------------------------------------------
01011001 11100010 01011100 00010100 11000100 00111111 11110011 11101111 00010000 00100111 11111100 00110100 10000100 01111000 01111110 11010010  (ciphertext)

Verwenden Sie schließlich bc, xxd und base64, um den binären Chiffretext in base64 zu konvertieren:

echo "obase=16; ibase=2; 01011001111000100101110000010100110001000011111111110011111011110001000000100111111111000011010010000100011110000111111011010010" | bc | xxd -p -r | base64

Dies erzeugt WeJcFMQ/8 + 8QJ/w0hHh + 0g ==, dies ist der vom OP in der obigen Frage veröffentlichte Chiffretext.


Ich entschuldige mich, wenn diese Antwort erfunden erscheint. Zugegeben, das ist es. Ähnliche Fragen, bei denen das Poster nur Chiffretext enthält und nach Einsichten darüber fragt, wie dieser Chiffretext hätte erzeugt werden können, scheinen auf security.stackexchange.com recht häufig zu erscheinen. und diese Frage wird oft als Duplikat zu diesen bezeichnet. Mit dieser Antwort soll veranschaulicht werden, dass Fragen dieser Art nicht beantwortet werden können, da es für diese Art von Fragen unendlich viele Lösungen gibt.

1
mti2935

Der einzige Weg ist, wenn es einige Metadaten gibt, die Ihnen sagen. Zum Beispiel habe ich in letzter Zeit mit PDFs gearbeitet, und das Format enthält ein Wörterbuch, das den Filter, den Algorithmus, die Schlüsselgröße usw. enthält. Wenn Sie jedoch nur den Chiffretext haben, haben Sie nur einen undurchsichtigen Fleck Daten.

1
user185