it-swarm.com.de

Ist es möglich, SHA1 zu entschlüsseln?

Ist es möglich, das in db gespeicherte Passwort mit dem Algorithmus SHA1 Zu entschlüsseln (die tatsächliche Zeichenfolge beizubehalten)?.

Beispiel: Wenn das Passwort "password" Lautet und in db als "sha1$4fb4c$2bc693f8a86e2d87f757c382a32e3d50fc945b24" Gespeichert ist, kann dieselbe "password"(string) aus "sha1$4fb4c$2bc693f8a86e2d87f757c382a32e3d50fc945b24" Beibehalten werden.

12
user2725407

SHA1 ist eine kryptografische Hash-Funktion. Mit dem Entwurf sollte also vermieden werden, was Sie versuchen.

Jedoch brechen ein SHA1 Hash ist technisch möglich. Sie können dies tun, indem Sie nur versuchen zu erraten, was gehackt wurde. Dieser Brute-Force-Ansatz ist natürlich nicht effizient, aber das ist so ziemlich der einzige Weg.

Zur Beantwortung Ihrer Frage: Ja, das ist möglich, aber Sie benötigen erhebliche Rechenleistung. Einige Forscher schätzen, dass es kostet $ 70k - $ 120k .

Soweit wir heute wissen, gibt es auch keinen anderen Weg, als die gehashten Eingaben zu erraten. Dies liegt daran, dass Vorgänge wie mod Informationen aus Ihrer Eingabe entfernen. Angenommen, Sie berechnen mod 5 und du bekommst 0. Was war der Input? War es 0, 5 oder 500? Sie sehen, Sie können in diesem Fall nicht wirklich "zurückgehen".

22
productioncoder

SHA1 ist ein One-Way-Hash. Man kann es also nicht wirklich rückgängig machen.

Aus diesem Grund verwenden Anwendungen es, um den Hash des Passworts und nicht das Passwort selbst zu speichern.

Wie jede Hash-Funktion ordnet SHA-1 eine große Eingabemenge (die Tasten) einer kleineren Zielmenge (den Hash-Werten) zu. Somit können Kollisionen auftreten. Dies bedeutet, dass zwei Werte der Eingabemenge demselben Hashwert zugeordnet sind.

Offensichtlich steigt die Kollisionswahrscheinlichkeit, wenn die Zielmenge kleiner wird. Umgekehrt bedeutet dies aber auch, dass die Kollisionswahrscheinlichkeit abnimmt, wenn der Zielsatz größer wird und der Zielsatz von SHA-1 160 Bit beträgt.

Jeff Preshing hat einen sehr guten Blog über Hash Collision Probabilities geschrieben, der Ihnen helfen kann, den zu verwendenden Hash-Algorithmus zu bestimmen. Vielen Dank, Jeff.

In seinem Blog zeigt er eine Tabelle, in der die Wahrscheinlichkeit von Kollisionen für einen bestimmten Eingabesatz angegeben ist.

Hash Collision Probabilities Table

Wie Sie sehen, beträgt die Wahrscheinlichkeit eines 32-Bit-Hash 1 zu 2, wenn Sie 77163 Eingabewerte haben.

Ein einfaches Java Programm zeigt uns, was seine Tabelle zeigt:

public class Main {

    public static void main(String[] args) {
        char[] inputValue = new char[10];

        Map<Integer, String> hashValues = new HashMap<Integer, String>();

        int collisionCount = 0;

        for (int i = 0; i < 77163; i++) {
            String asString = nextValue(inputValue);
            int hashCode = asString.hashCode();
            String collisionString = hashValues.put(hashCode, asString);
            if (collisionString != null) {
                collisionCount++;
                System.out.println("Collision: " + asString + " <-> " + collisionString);
            }
        }

        System.out.println("Collision count: " + collisionCount);
    }

    private static String nextValue(char[] inputValue) {
        nextValue(inputValue, 0);

        int endIndex = 0;
        for (int i = 0; i < inputValue.length; i++) {
            if (inputValue[i] == 0) {
                endIndex = i;
                break;
            }
        }

        return new String(inputValue, 0, endIndex);
    }

    private static void nextValue(char[] inputValue, int index) {
        boolean increaseNextIndex = inputValue[index] == 'z';

        if (inputValue[index] == 0 || increaseNextIndex) {
            inputValue[index] = 'A';
        } else {
            inputValue[index] += 1;
        }

        if (increaseNextIndex) {
            nextValue(inputValue, index + 1);
        }

    }

}

Meine Ausgabe endet mit:

Collision: RvV <-> SWV
Collision: SvV <-> TWV
Collision: TvV <-> UWV
Collision: UvV <-> VWV
Collision: VvV <-> WWV
Collision: WvV <-> XWV
Collision count: 35135

Es wurden 35135 Kollisionen erzeugt und das ist fast die Hälfte von 77163. Und wenn ich das Programm mit 30084 Eingabewerten laufen lasse, ist die Kollisionszahl 13606. Dies ist nicht genau 1 von 10, aber es ist nur eine Wahrscheinlichkeit und das Beispielprogramm ist nicht perfekt , weil nur die ASCII-Zeichen zwischen A und z verwendet werden.

Nehmen wir die zuletzt gemeldete Kollision und überprüfen Sie

System.out.println("VvV".hashCode());
System.out.println("WWV".hashCode());

Meine Ausgabe ist

86390
86390

Fazit:

Wenn Sie einen SHA-1-Wert haben und den Eingabewert wiederherstellen möchten, können Sie einen Brute-Force-Angriff versuchen. Dies bedeutet, dass Sie alle möglichen Eingabewerte generieren, sie hashen und mit dem SHA-1 vergleichen müssen, den Sie haben. Das kostet aber viel Zeit und Rechenleistung. Einige Leute haben sogenannte Regenbogentabellen für einige Eingabesätze erstellt. Diese existieren jedoch nur für einige kleine Eingabesätze.

Und denken Sie daran, dass viele Eingabewerte einem einzelnen Ziel-Hashwert zugeordnet sind. Selbst wenn Sie alle Zuordnungen kennen würden (was unmöglich ist, da die Eingabemenge nicht begrenzt ist), können Sie immer noch nicht sagen, um welchen Eingabewert es sich handelt.

6
René Link

Da SHA-1 mehrere Byte-Sequenzen auf eine abbildet, können Sie einen Hash nicht "entschlüsseln", aber theoretisch können Sie Kollisionen finden: Strings, die denselben Hash haben.

Es scheint, dass das Brechen eines einzelnen Hashs derzeit etwa 2,7 Millionen US-Dollar Computerzeit kosten würde, sodass Ihre Bemühungen wahrscheinlich besser an einem anderen Ort verbracht werden sollten.

5
Joni