Pregunta

Estoy tratando de almacenar una contraseña en un archivo que me gustaría recuperar para más tarde.Hash no es una opción, ya que necesito la contraseña para conectarse a un servidor remoto para más tarde.

El siguiente código funciona bien, pero crea una salida diferente cada vez, incluso aunque la clave es la misma.Esto es malo como cuando la aplicación se cierra y se reinicia no voy a ser capaz de recuperar mi contraseña más.¿Cómo puedo almacenar las contraseñas en un archivo y recuperarlos más tarde?

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;
    }
}
¿Fue útil?

Solución

Yo creo que lo que sucede es que el crypto proveedor es al azar la generación de una inyección INTRAVENOSA.Especificar esto y ya no debería ser diferente.

Editar:Usted puede hacer esto en su 'keyProvider' por la configuración de la IV a la propiedad.

Otros consejos

De acuerdo a la documentación de CreateEncryptor:

Si el actual IV de la propiedad es null de referencia (Nothing en Visual Basic), el GenerateIV método es llamado a crear un nuevo aleatoria IV.

Esto hará que el texto cifrado diferente cada vez.

Nota:una forma de evitar esto es discutido aquí donde me sugieren puede anteponer el texto sin formato con un mac ...a continuación, el primer bloque de texto cifrado es, efectivamente, la IV, pero no es repetible

Es necesario especificar una IV (vector de inicialización), incluso si se genera una al azar.Si utiliza azar IV, a continuación, se deben almacenar junto con el texto cifrado, de modo que usted puede utilizar más adelante en el descifrado, o puede derivar de una inyección INTRAVENOSA de algunos otros datos (por ejemplo, si usted está cifrado con una contraseña, puede obtener la IV desde el nombre del usuario).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top