-1

Ich schrieb eine Hashing-Funktion für die Passwort- und Schlüsselgenerierung, erkannte aber ziemlich schnell, dass die Möglichkeit, den Hash umzukehren, sehr wertvoll war, also schrieb ich eine entgegengesetzte Funktion, jedoch dosent Arbeit. Ich verstehe nicht, warum das nicht funktioniert.Warum deaktiviert diese Unhash-Funktion diesen Hash nicht?

function hash64(n:uint):uint 
{ 
    n = (~n) + (n << 21); 
    n = n^(n >> 24); 
    n = (n + (n << 3)) + (n << 8); 
    n = n ^(n >> 14); 
    n = (n + (n << 2)) + (n << 4); 
    n = n^(n >> 28); 
    n = n + (n << 31); 
    return n; 
} 

function unhash64(n:uint):uint 
{ 
    n = (~n) - (n >> 21); 
    n = n^(n << 24); 
    n = (n - (n >> 3)) - (n >> 8); 
    n = n^(n << 14); 
    n = (n - (n >> 2)) - (n >> 4); 
    n = n^(n << 28); 
    n = n - (n >> 31); 
    return n; 
} 

Ausgabe bei 1000 eingespeist:

Hashed from 1000:   1221775646 
Unhash output:    1963490760 
+0

Was haben Sie erwartet? 1000? – Organis

+0

Ja, ist das unmöglich? – ZxZ

+3

Das ist der Punkt der Kryptographie, eigentlich: Es sollte ** nicht möglich sein, die ursprünglichen Daten aus dem Hash wiederherzustellen. Sonst als es im Laufe der Jahre brutal zu erzwingen, dass es. – Organis

Antwort

5

Das erste offensichtliche Problem ist, dass es in der Zeit nicht widergespiegelt wird. Das manchmal funktioniert (wenn die Reihenfolge der Vorgänge in erster Linie keine Rolle), aber im Allgemeinen ist die inverse y = f(g(x))x = g⁻¹(f⁻¹(y)). f wurde zuletzt angewendet, muss also zuerst rückgängig gemacht werden. Vergleichen Sie: Wenn Sie zuerst Ihre Socken und dann Ihre Schuhe anziehen, sollten Sie wahrscheinlich zuerst Ihre Schuhe und dann Ihre Socken ausziehen.

Darüber hinaus sind viele Inversen einfach falsch, mit zu beginnen. Zum Beispiel ist das Inverse von
m = n^(n >> 24)n = m^(m >> 24), und das Inverse von m = (n + (n << 2)) + (n << 4) ist n = m * 0x3cf3cf3d (es ist ein modular multiplicative inverse). Es ist nicht so einfach wie die Richtung der Schicht.

Nicht getestet, aber diese sind alle Umkehrungen in der richtigen Reihenfolge:

n = n * 0x80000001; 
n = n^(n >> 28); 
n = n * 0x3cf3cf3d; 
n = n^(n >> 14)^(n >> 28); 
n = n * 0x1c03dd39; 
n = n^(n >> 24); 
n = (n + 1) * 0xffdfffff; 
1

Hashes sind nicht umkehrbar. Wenn Sie eine reversible Funktion verwenden möchten, die die ursprüngliche Eingabe verbirgt, verwenden Sie stattdessen eine Verschlüsselung. Verschlüsselungen sind reversibel, solange Sie den richtigen Schlüssel haben.

Es gibt bereits bekannte Techniken zur Passwort- und Schlüsselgenerierung. Wenn Sie versuchen, Ihre eigenen Versionen zu erstellen, sind sie unsicher. Das ist nicht wichtig, alles was du tun willst, ist Dinge vor deinem kleinen Bruder zu verstecken. Wenn Sie im kaufmännischen Bereich arbeiten, werden Sie möglicherweise verklagt. Verwenden Sie daher alle vorhandenen sicheren Standardmethoden. Vielleicht möchten Sie Key Derivation Funktionen wie PBKDF2 oder Argon2 erforschen.

Verwandte Themen