Ich habe den Eindruck, dass eine verschlüsselte Zeichenfolge nicht entschlüsselt werden kann, sodass der ursprüngliche Wert für immer verloren geht.
Wenn die folgende Zeichenfolge jedoch immer "dominic" (mein Name) ist, kann es keinen logischen Weg geben, sie umzukehren. Da es weder zufällig ist noch auf Datum / Uhrzeit basiert, gibt es eine logische Methode dafür?
0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=
Egal was oder wie oft ich "dominic" (Zeichenfolge) verschlüssele, es ist immer gleich wie oben. Sollte es also keine Möglichkeit geben, eine solche Zeichenfolge zu entschlüsseln?
Beispiel für das, wovon ich spreche:
public string EncryptPassword(string password)
{
return Convert.ToBase64String(
System.Security.Cryptography.SHA256.Create()
.ComputeHash(Encoding.UTF8.GetBytes(password)));
}
encryption
user1477388
quelle
quelle
SHA256
ist eine kryptografische Hash-Funktion , kein Verschlüsselungsalgorithmus. Es ist eine Einwegfunktion .Antworten:
Die Verschlüsselung kann immer umgekehrt werden. Der Punkt der Verschlüsselung besteht darin, eine Nachricht aufzunehmen und mit einem geheimen Schlüssel zu verschlüsseln, sodass nur eine andere Person, die über den Schlüssel verfügt, die Verschlüsselung umkehren und die Nachricht lesen kann.
Was Sie hier sehen, ist Hashing , was nicht mit Verschlüsselung identisch ist, obwohl bei der Implementierung von Hashes häufig kryptografische Techniken verwendet werden. Die Idee eines Hash ist, dass er komplizierte mathematische Techniken verwendet, um einen neuen Wert zu erstellen, der einem alten Wert zugeordnet wird, der wiederholbar ist. Es gibt keinen Schlüssel und er soll nicht umgekehrt werden. Ein kryptografisch starker Hash wird mit der mathematischen Eigenschaft erstellt, dass es sehr, sehr schwierig ist, absichtlich einen anderen Wert zu erstellen , auf den auch gehasht wird , wenn Sie einen Wert haben,
A
dessen Hash WertB
ist .C
B
Hashes müssen nicht umkehrbar sein, da sie zur Authentifizierung verwendet werden. Wenn Sie mir einen Benutzernamen und ein Passwort geben, möchten Sie wirklich nicht, dass ich dieses Passwort in meiner Datenbank speichere, denn wenn sich jemand einhackt und Zugriff auf meine Datenbank erhält, kann er Ihr Passwort erhalten! Stattdessen würde ich den Hash Ihres Passworts in der Datenbank speichern. Wenn Sie sich dann anmelden, überprüfe ich, ob es einen Benutzernamen gibt, der mit Ihrem übereinstimmt, mit einem Kennworteintrag, der mit dem Hash des von Ihnen gesendeten Kennworts übereinstimmt, und wenn ja, sind Sie authentifiziert, da es sehr schwierig ist, eine Hash-Kollision zu erstellen ( zwei Werte, die auf den gleichen Wert hashen) mit einem guten Hash, daher bin ich mir fast sicher, dass das von Ihnen verwendete Passwort das richtige ist.
Die andere Eigenschaft eines starken kryptografischen Hash ist, dass es sehr schwierig ist, ihn umzukehren. Sie wissen, dass der Wert
0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=
der Hash für "dominic" ist, weil Sie es gerade ausgearbeitet haben, aber wenn Sie das nicht wussten und nicht wussten, wo Sie anfangen sollten, und alles, was Sie hatten, war0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=
, könnten Sie buchstäblich Milliarden brauchen von Jahren, um herauszufinden, dass das Original "dominant" war, wenn der Hash ein guter ist. Dies ist wiederum nützlich, um Kollateralschäden zu vermeiden, falls eine Passwortliste gestohlen wird.quelle
Was Sie tun, ist per se keine "Verschlüsselung"; es ist "Hashing". Der wesentliche Unterschied zwischen den beiden ist , dass die Verschlüsselung ist leicht umkehrbar (mit dem richtigen Schlüssel natürlich), während Hashing ausgelegt ist äußerst schwierig, andere unter allen Umständen rückgängig als die ursprüngliche Nachricht an erster Stelle zu kennen.
Theoretisch simulieren Hashes ein "zufälliges Orakel", einen hypothetischen Homunkulus mit einem eidetischen Gedächtnis und eine Möglichkeit, vollkommen eindeutige, vollkommen zufällige Zahlen ohne obere Bereichsgrenze zu erzeugen. Sie würden diesem kleinen Mann eine Nachricht geben, und eines von zwei Dingen würde passieren; Entweder hat er die Nachricht noch nie gesehen. In diesem Fall generiert er eine neue Zufallszahl und gibt diese als Digest an, oder er hat diese Nachricht schon einmal gesehen. Er erinnert sich und gibt Ihnen die Nummer, die er generiert hat, als er sie gesehen hat erstes Mal. In diesem theoretischen Modell gibt es keine Beziehung zwischen einer Nachricht und ihrem Digest, und da keine einzelne Zahl jemals zweimal im RNG erscheint, besteht keine Möglichkeit für eine Kollision.
Leider haben wir kein ideales zufälliges Orakel; Die Idee hat praktische Unmöglichkeiten für eine digitale Implementierung, wie die Fähigkeit des Orakels, jede Nachricht, die jemals von irgendjemandem gehasht wurde, effizient zu speichern und effizient abzurufen, und die Fähigkeit der Kunden, eine Zahl zu akzeptieren, die Hunderte oder Tausende von Dezimalstellen umfassen kann in der Länge. Stattdessen haben wir Hash-Funktionen, die irreversible (Einweg-) mathematische Operationen sind, die an der Nachricht selbst arbeiten, um eine deterministische Transformation (dieselbe Nachricht => gleicher Hash) ohne erkennbaren Wert zu erstellenBeziehung zwischen dem Hash und der ursprünglichen Nachricht. Wie in den Kommentaren erwähnt, sollte es auch keine vorhersehbare Änderung des Hash-Werts geben, die durch systematische Änderungen an der Nachricht erzeugt wird. Im Idealfall hätte jedes Bit des Digests eine 50% ige Chance, sich zu ändern, wenn ein einzelnes Bit der Nachricht geändert wird.
Es gibt viele Verwendungsmöglichkeiten für eine Hash-Funktion. Sie werden zur Überprüfung von Herausforderungen verwendet (denken Sie an Anmeldeinformationen wie Kennwörter), ohne dass beide Parteien das Klartextgeheimnis kennen müssen, und sie werden als Prüfsummen verwendet, um zu überprüfen, ob eine Nachricht nicht manipuliert oder beschädigt wurde. Sie werden auch in sogenannten "Proof of Work" -Szenarien verwendet. Rechenaufgaben, die schwer zu erledigen, aber leicht zu überprüfen sind.
Wenn Sie jemals einen Weg finden würden, einen SHA256-Hash-Digest effizient umzukehren, um eine Nachricht (eine beliebige Nachricht) zu erzeugen, die zu diesem Hash führen würde, wäre dies ein Beweis dafür, dass der Hash tatsächlich grundlegend fehlerhaft ist. SHA256 wird in der Tat als sicher angesehen, was bedeutet, dass es keine dokumentierte Methode gibt, egal wie praktisch sie ist, um mit einem Hash-Digest zu beginnen und eine kollidierende Nachricht zu erstellen, die weniger Arbeit erfordert, als einfach jede Möglichkeit auszuprobieren (was für SHA-256 idealerweise 2 ist ^ 256 ~ = 10 ^ 77 Möglichkeiten).
quelle