2016-07-26 25 views
-1

ich diese einfache Klasse haben, die von 2 Methoden hat:feste Salzerzeugung basierend auf Eingabezeichenfolge - C#

private static byte[] PBKDF2(string field, byte[] salt, int iterations, int outputBytes) 

    { 
     Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(field, salt); 
     pbkdf2.IterationCount = iterations; 
     return pbkdf2.GetBytes(outputBytes); 
    } 

public static string CreateHash(string field, String salt) 
    { 
     //if (Array.TrueForAll(salt, x => x == 0)) 
     //{ 
     // RNGCryptoServiceProvider csprng = new RNGCryptoServiceProvider(); 
     // csprng.GetBytes(salt); 
     // string s = Convert.ToBase64String(salt); 
     //} 
     byte[] salts = Encoding.ASCII.GetBytes(salt); 
     byte[] hash = PBKDF2(field, salts, PBKDF2_ITERATIONS, HASH_BYTE_SIZE); 
     return Convert.ToBase64String(hash); 
    } 

Ich brauche ein Front-End zur Verfügung zu stellen, wo Benutzer eine einfache Zeichenkette wie „ABC“ eintritt und ich brauche um daraus ein Salz zu erzeugen. Dies werde ich in der Datenbank speichern und verwenden, um die obige Methode (CreateHash) zu verwenden, um Daten zu de-identifizieren. Dieser Salt/Key muss entschlüsselt werden können, was ich im Front-End zeigen muss.

Ich kann andere Klassen/Bibliothek auch verwenden. Es muss nicht Rfc2898DeriveBytes sein.

Bitte geben Sie mir einige Eingaben, wie ich diese Funktion zur Erzeugung von Salz/Schlüssel erreichen kann. Dieses Salz kann kein zufälliger Wert sein.

Danke!

+4

Salze sollten zufällig sein und nicht auf Benutzereingaben basieren. Der gesamte Punkt eines Salzes ist, wenn jemand zweimal die gleiche Eingabe eingibt, erhalten Sie zwei verschiedene Ausgaben. Wenn Sie dies tun, weil Sie "das Salz wissen müssen", wenn Sie gehen, um das 'byte []' zu überprüfen, alles, was Sie tun müssen, ist nur vor oder anhängen das Salz an die Vorder- oder Rückseite des binären Flecks, wenn Sie gehen Vergewissern Sie sich, dass Sie das Salz abziehen und in die PBKDF2-Funktion einspeisen. –

+0

Möglich [Lösung] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/d6a2836a-d587-4068-8630-94f4fb2a2aeb/encrypt-and-decrypt-a-string-in-c? forum = csharpgeneral) aber es verwendet Rfc2898 ... Warum willst du es nicht benutzen? –

+0

@ScottChamberlain Ich verstehe, dass Salz dynamisch sein soll, aber die Anforderung ist hier anders. Dies ist nicht zum Speichern von Passwörtern gedacht. Wir müssen Daten identifizieren und in Dateien speichern. Jedes Mal, wenn eine Datei mit Daten geliefert wird, verschlüsseln wir sie und erzeugen eine andere Datei. Alle persönlichen Informationen werden anonymisiert. Aber zum Beispiel für ein gegebenes Feld, sagen wir Vorname David, muss es immer in die gleiche verschlüsselte Zeichenfolge konvertiert werden, die zuvor generiert wurde. Es ist nicht von mir definiert! Wenn ich das Salz repariere und zu Rfc2898DeriveBytes passiere, um die gleiche Zeichenkette für die gleiche Eingabe zu erhalten. – vrkala

Antwort

0

Sie erwähnen, dass Sie die Hash-Zeichenfolge entschlüsseln müssen.

PBKDF2 ist kein Verschlüsselungsalgorithmus, sondern eine Schlüsselableitungsfunktion, und Sie können nicht die ursprüngliche Eingabe aus dem resultierenden Hash berechnen, mit oder ohne das Salz.

Was Sie suchen sollten, ist Verschlüsselung, nicht Hashing.

Werfen Sie einen Blick auf this link für einige Beispiele.