2009-08-12 14 views
4

Ich suche Daten zu verschlüsseln. Ich möchte Verschlüsselungsschlüssel basierend auf einem Passwort und einigen beweglichen Wert, wie Zeit generieren. Das Ziel ist es, den Schlüssel zu ändern, aber jeder, der das Passwort kennt, kann entschlüsseln. Dies geschieht in C#. Ich verwende den folgenden Code, um das Passwort zu hashen.Wie würden Sie einen wiederholbaren Verschlüsselungsschlüssel generieren?

private static string GetPasswordHash(string password) 
{ 
    TimeSpan span = (DateTime.UtcNow - new DateTime(1900, 1, 1)); 
    string result = Convert.ToInt32(span.TotalHours).ToString(); 
    result += password; 
    result += Convert.ToInt32(span.TotalDays).ToString(); 
    result = Convert.ToBase64String(SHA256.Create().ComputeHash(Encoding.ASCII.GetBytes(result))); 
    return result; 
} 

Ich benutze dann diesen Hash, plus ein Salz, um einen Schlüssel zu generieren.

 Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(GetPasswordHash(password), salt); 
     rdb.IterationCount = 1000; 

     RijndaelManaged rm = new RijndaelManaged(); 
     rm.KeySize = 256; 
     rm.Key = rdb.GetBytes(32); 
     rm.IV = rdb.GetBytes(16); 

Es scheint Probleme mit der Art, wie ich dies tue. Einige der Computer befinden sich in unterschiedlichen Zeitzonen, oder wenn die Stunde anläuft, während ich die Daten sende, oder wenn die Maschinenzeiten geringfügig abweichen. Gibt es bessere Vorschläge?

Antwort

8

Die Standardstrategie besteht darin, nur den Wert (Zeit usw.) zu senden, der nur mit dem Verschlüsselungsschlüssel gesendet wird. Da der von Ihnen verwendete Wert öffentlich bekannt ist, ist es in Ordnung, wenn der Benutzer, der das Kennwort zuerst erstellt, den "beweglichen Wert" öffentlich bereitstellt. Siehe Salt. Was Sie tun, ist keine neue Technik. Sie scheinen auch Key Strengthening zu verwenden.

1

Sie könnten ein Schema finden, das den gleichen Bewegungswert über ein Zeitfenster erzeugt, zentriert auf die aktuelle Zeit. Wenn Sie also ein Fenster von 12 Stunden wählen, erzeugen alle Computer, die 6 Stunden zurückliegen und 6 Stunden voraus sind, denselben Verschlüsselungsschlüssel.

2

Sie können den Änderungsteil (unverschlüsselt) zusammen mit den verschlüsselten Daten senden, so dass jeder, der das geheime Passwort kennt, das für die Verschlüsselung verwendete Passwort leicht rekonstruieren kann. Da der sich ändernde Teil relativ leicht zu erraten ist, würde er nicht viel weniger sicher machen.

0

Sind Sie besorgt, dass eine Datei mit denselben Daten, die mit dem gleichen Passwort verschlüsselt sind, gleich aussieht? Sie könnten den Initialisierungsvektor mit der aktuellen Uhrzeit einstellen und mit Ihrem Passwort verschlüsseln. Zum Entschlüsseln verwenden Sie den gleichen IV-Wert (also muss dieser unverschlüsselt mit Ihrer Datei irgendwo gespeichert werden).

0

Die passwortbasierte Schlüsselableitung ist bereits in .net implementiert. Während ich mit Ihrer Funktion GetPasswordHash() nichts falsches sehen kann, ist es immer sinnvoll, Bibliotheksfunktionen in Krypto zu verwenden, da sie wahrscheinlich besser getestet werden und kleine Fehler die Sicherheit eines Systems vollständig zerstören können. Here're zwei Links, gibt es wahrscheinlich andere auch:

rfc2898derivebytes

passwordderivebytes

Verwandte Themen