2009-08-01 4 views
0

私はwinformアプリケーションといくつかのWebサービスへのログインのリストを持っています。チェック時に私は暗号化されたパスワードと一緒にファイルに辞書をシリアライズが、これはそのようなことかどうかを行うための最善の慣行があるのだろうか「私を覚えて」.. は、ここに私のコードログインフォームをwinformアプリケーションに保存する方法は?

public void LoginsInit() 
{ 
    FileStream file = new FileStream(loginsFilePath, FileMode.OpenOrCreate); 
    try 
    { 
    BinaryFormatter formatter = new BinaryFormatter(); 
    loginsDictionary = (Dictionary<string, string>)formatter.Deserialize(file); 
    string[] allusers = loginsDictionary.Keys.ToArray(); 
    int usersCount = allusers.Length; 
    userNameTextBox.Text = allusers[usersCount - 1]; 
    } 
    catch (SerializationException ex) 
    { 
    loginsDictionary = new Dictionary<string, string>(); 
    Console.WriteLine("Failed to open file: " + ex.Message); 
    } 
    finally 
    { 
    file.Close(); 
    } 
} 

private void login_Click(object sender, EventArgs e) 
{ 
    //LoginToService(); 
    string username; 
    string password; 
    username = serviceClientReference.UserLogin = userNameTextBox.Text; 
    password = serviceClientReference.Password = EncryptDecrypt.Encrypt(this.passwordTextBox.Text, EncryptDecrypt.c_strEncryptkey1, EncryptDecrypt.c_strEncryptkey2); 

    if (rememberMe.Checked) 
    { 
    if (loginsDictionary.ContainsKey(username)) 
     loginsDictionary[username] = password; 
    else 
     loginsDictionary.Add(username, password); 
    } 
    FileStream file = new FileStream(loginsFilePath, FileMode.Create); 
    try 
    { 
    BinaryFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(file, loginsDictionary); 
    file.Flush(); 
    } 
    catch (SerializationException ex) 
    { 
    Console.WriteLine("Failed to open file: " + ex.Message); 
    } 
    finally 
    { 
    file.Close(); 
    } 

    string errorStr; 
    int errorNo; 
    try 
    { 
    bool res = serviceClientReference.EstablishConnection(out errorStr, out errorNo); 
    if (!res) 
    { 
     MessageBox.Show(errorStr); 
    } 
    } 
    catch (Exception exception) 
    { 
    Logger.Log(TraceLevel.Error, "", exception); 
    MessageBox.Show("Fatal Error Unable to login to MU"); 
    } 
} 

private void usernameTextBox_TextChanged(object sender, EventArgs e) 
{ 
    if (loginsDictionary.ContainsKey(userNameTextBox.Text)) 
    passwordTextBox.Text = EncryptDecrypt.Decrypt(loginsDictionary[userNameTextBox.Text], EncryptDecrypt.c_strEncryptkey1, EncryptDecrypt.c_strEncryptkey2); 
} 
+0

私の機能を覚えているかどうかは、時間がたつにつれて良くなる(アプリケーションを閉じて開き直す)のか、それともアプリケーションの現在の機能のためだけですか? – CertifiedCrazy

+0

時間がたつにつれて良いです。 LoginsInit()は、作成されたファイルから辞書をインスタンス化するためにintance構築時に呼び出されます – mustafabar

答えて

1

の設定をのアプリケーションインスタンスに保存する場合は、.NETに組み込まれているApplication Settings Architectureを確認する必要があります。これにより、永続化と再ロードの機能が提供されます(設定が必要)。追加のセキュリティと機能のためにIsolated Storageもあります。あなたが何を使用しているかに関わらず、パスワードを暗号化し続けます。

3

あなたがかもしれないですDPAPIを使用してキーを管理することを検討してください。

0

パスワードなどの機密情報を管理する場合は、SecureStringクラス を使用して資格情報を保存することをお勧めします。

関連する問題