Frage

Ich versuche, ein Passwort in einer Datei zu speichern, die ich für später abrufen möchte. Hashing ist keine Option, da ich das Passwort für die Verbindung zu einem Remote-Server für später benötigen.

Der folgende Code funktioniert gut, aber es schafft eine andere Ausgabe jedes Mal, obwohl der Schlüssel gleich ist. Das ist schlecht, als wenn die Anwendung heruntergefahren und neu gestartet werde ich mein Passwort abrufen mehr nicht in der Lage sein. Wie kann ich speichern Passwörter in einer Datei und rufen Sie sie später?

public class EncyptDecrypt {

    static System.Security.Cryptography.TripleDESCryptoServiceProvider keyProv = new System.Security.Cryptography.TripleDESCryptoServiceProvider();

    public static System.Security.Cryptography.TripleDESCryptoServiceProvider KeyProvider {
        get {
            keyProv.Key = new byte[] { /* redacted with prejudice */ };
            return keyProv;
        }
    }

    public static string Encrypt(string text, SymmetricAlgorithm key) {

        if (text.Equals(string.Empty)) return text;

        // Create a memory stream.
        MemoryStream ms = new MemoryStream();

        // Create a CryptoStream using the memory stream and the
        // CSP DES key.
        CryptoStream encStream = new CryptoStream(ms, key.CreateEncryptor(), CryptoStreamMode.Write);

        // Create a StreamWriter to write a string
        // to the stream.
        StreamWriter sw = new StreamWriter(encStream);

        // Write the plaintext to the stream.
        sw.WriteLine(text);

        // Close the StreamWriter and CryptoStream.
        sw.Close();
        encStream.Close();

        // Get an array of bytes that represents
        // the memory stream.
        byte[] buffer = ms.ToArray();

        // Close the memory stream.
        ms.Close();

        // Return the encrypted byte array.
        return System.Convert.ToBase64String(buffer);
    }

    // Decrypt the byte array.
    public static string Decrypt(string cypherText, SymmetricAlgorithm key) {

        if (cypherText.Equals(string.Empty)) return cypherText;

        string val;

        try {
            // Create a memory stream to the passed buffer.
            MemoryStream ms = new MemoryStream(System.Convert.FromBase64String(cypherText));

            // Create a CryptoStream using the memory stream and the
            // CSP DES key.
            CryptoStream encStream = new CryptoStream(ms, key.CreateDecryptor(), CryptoStreamMode.Read);

            // Create a StreamReader for reading the stream.
            StreamReader sr = new StreamReader(encStream);

            // Read the stream as a string.
            val = sr.ReadLine();

            // Close the streams.
            sr.Close();
            encStream.Close();
            ms.Close();
        }
        catch (System.Exception) {

            return string.Empty;
        }

        return val;
    }
}
War es hilfreich?

Lösung

Ich glaube, dass passiert, was ist, dass der Krypto-Anbieter zufällig ein IV erzeugt. Geben Sie diese, und es sollte nicht mehr unterscheiden.

Edit:. Sie können dies tun, in Ihrem keyProvider 'durch die IV-Eigenschaft

Andere Tipps

Nach der Dokumentation von CreateEncryptor:

  

Wenn die aktuelle IV-Eigenschaft ist ein Null   (Nothing in Visual Basic),   die GenerateIV Methode wird aufgerufen   Erstellen Sie eine neue zufällige IV.

Dies wird der verschlüsselte Text jedes Mal anders machen.

Hinweis: eine Möglichkeit, um dies wird diskutiert hier wo ich vorschlagen, dass Sie den Klartext mit einem mac prepend können ... dann der erste Block von verschlüsseltem Text ist effektiv die IV, aber es ist alles wiederholbar

Sie benötigen eine IV (Initialisierungsvektor) angeben, auch wenn Sie einen gelegentlichen erzeugen. Wenn Sie zufällig IV verwenden, dann müssen Sie es speichern, mit dem verschlüsselten Text zusammen, so dass Sie es später Entschlüsselung verwenden können, oder Sie können eine IV von einigen anderen Daten (zum Beispiel ableiten, wenn Sie ein Passwort sind verschlüsselt, können Sie die IV ergeben sich aus der Benutzername).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top