2016-08-30 2 views
0

Ich arbeite an einem Projekt, das eine Zeichenfolge verschlüsselt, die der einfache Teil ist. Der schwierige Teil besteht darin, eine Methode zu finden, mit der die Zeichenfolge vor der Verschlüsselung durchsucht werden kann und die einen Wert mit einer Kollisionsdomäne zurückgibt. Dieser Hash wird zusammen mit der verschlüsselten Zeichenfolge in einer Datenbanktabelle gespeichert.C# Hash mit Collision Domain

Der Grund dafür ist, eine Teilmenge zum Entschlüsseln zu erstellen, wenn nach einem einzelnen Datensatz gesucht werden muss. Wie kann dies mit C# erreicht werden?

+0

Welchen Teil benötigen Sie bei der Erstellung der Kollisionsdomäne oder der Erstellung des Hashs? –

+1

Wie viele Kollisionen sprechen wir hier? Wenn der einzige Zweck darin besteht, zu überprüfen, ob Sie nur eindeutige Hashes überprüfen, würden Sie viele Kollisionen benötigen, um diesen Check wert zu machen. Wie Scott Chamberlain in seiner Antwort sagte, schwächt das Hash die Verschlüsselung, weil es Informationen an die bösen Jungs verliert. –

+1

Wenn Sie nur auf Kollisionen prüfen müssen, würde ich NUR empfehlen, den Hash zu speichern. Wenn Sie den Wert wieder herausholen müssen, speichern Sie eine Nachschlagetabelle mit Hash -> verschlüsselten Daten, um zu vermeiden, dass mehrere Blobs verschlüsselter Daten aus demselben Klartext gespeichert werden. –

Antwort

0

Ich nehme an, Sie benötigen Hilfe beim Erstellen der Kollisionsdomäne, der einfachste Weg, es zu tun ist, schreiben Sie eine Funktion, die die Zeichenfolge in eine neue Zeichenfolge mit einer hohen Kollisionswahrscheinlichkeit dann Hash diese neue Zeichenfolge für Ihren Lookup-Wert.

private static int COLLISION_LENGTH = 5; 
public static string CreateCollision(string oldValue) 
{ 
    var chars = new char[COLLISION_LENGTH]; 

    for(int i = 0; i < oldValue.Length; i++) 
    { 
     chars[i % chars.Length] ^= oldValue[i]; 
    } 

    return new String(chars); 
} 

Sie brauchen dann nur die Ausgabe von CreateCollision mit dem Hash-Algorithmus Ihrer Wahl Hash, empfehle ich ein starkes Hash-System wie verwenden Sie würden für ein Kennwort wie Rfc2898DeriveBytes und behandeln den Hash wie würden Sie ein Passwort (Sie müssen jedoch ein festes Salz verwenden), weil dieser Hash Informationen über die Daten, die Sie verschlüsselt haben, verliert.

Stellen Sie COLLISION_LENGTH nach Bedarf ein.

+0

Nachdem ich darüber nachgedacht habe, kann ich tatsächlich eine Implementierung von Adler32 verwenden, um den Wert zu berechnen. Weiß jemand, ob Adler32 reversibel ist, alle möglichen Kombinationen zu finden, um den gleichen Wert zu schaffen? – schwietertj

+0

Es hängt von der Eingabe, wenn der Text etwas festes Format hat und nur ein paar Worte unterscheiden zwischen der Schablone und dem Ergebnis, es möglich sein kann, einen Wörterbuch Angriff auf den Wortstellen zu tun, um herauszufinden, was Worte gehen, wo das gleiche bekommen Ergebnis aus dem Hash. –

+0

Das beantwortet meine Frage definitiv, da es sich um persönliche Identifikationsnummern handelt. Ich glaube, wir werden System.Security.Cryptography.HashAlgorithm verwenden, um den Wert zu generieren, der meiner Meinung nach in dot net core implementiert ist. – schwietertj