パスワードとかの機密情報を暗号化して保存する

アプリの中でログイン情報を保存するためにこういう画面を作ると思います。

で、パスワードを保存するためにこういうコード書いちゃうと思うんです。IsolatedStorageSettings つかって。

private void PhoneApplicationPage_Loaded_1(object sender, RoutedEventArgs e)
{
    if (IsolatedStorageSettings.ApplicationSettings.Contains("UserName"))
    {
        this.userNameTextBox.Text = IsolatedStorageSettings.ApplicationSettings["UserName"] as string;

    }
    if (IsolatedStorageSettings.ApplicationSettings.Contains("Password"))
    {
        this.passwordBox.Password = IsolatedStorageSettings.ApplicationSettings["Password"] as string;
    }
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    IsolatedStorageSettings.ApplicationSettings["UserName"] = this.userNameTextBox.Text;
    IsolatedStorageSettings.ApplicationSettings["Password"] = this.passwordBox.Password;
    IsolatedStorageSettings.ApplicationSettings.Save();
}

この IsolatedStorageSettings って、IsolatedStorage の __ApplicationSettings に平文でデータを保存します。こんな感じ。

<ArrayOfKeyValueOfstringanyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
	<KeyValueOfstringanyType>
		<Key>UserName</Key>
		<Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:string">iseebi</Value>
	</KeyValueOfstringanyType>
	<KeyValueOfstringanyType>
		<Key>Password</Key>
		<Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:string">Password</Value>
	</KeyValueOfstringanyType>
</ArrayOfKeyValueOfstringanyType>

いくらWindows PhoneではStoreから入ったアプリは保護されているとしても、バックアップするとかしちゃうとそのバイナリ経由でこのパスワードが入っている設定ファイルをかすめとられる可能性があるので、保護する必要があります。

iOS でも同様のことが言えまして、パスワードなどの機密情報の保存Keychain Servicesを使うことになっています。*1

Windows Phone では ProtectedDataクラス を使ってデータを暗号化して IsolatedStorage に保存します。

引数バイト配列なので、ラッパークラスつくってみました。

これをつかうと、こんなかんじに書けます。初期化コードを除けばさっきとほとんど同じですね。

private ProtectedSettingDictionary settings;

public MainPage()
{
    InitializeComponent();

    settings = new ProtectedSettingDictionary("ProtectedStore");
}

private void PhoneApplicationPage_Loaded_1(object sender, RoutedEventArgs e)
{
    if (this.settings.ContainsKey("UserName"))
    {
        this.userNameTextBox.Text = this.settings["UserName"];

    }
    if (this.settings.ContainsKey("Password"))
    {
        this.passwordBox.Password = this.settings["Password"];
    }
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    this.settings["UserName"] = this.userNameTextBox.Text;
    this.settings["Password"] = this.passwordBox.Password;
    this.settings.Save();
}

これで保存すると、IsolatedStorage に ProtectedStore というファイルができ、このファイルに暗号化されて保存されます。こんなかんじ。

ぜひ、パスワードは暗号化して保存してくださいね。

*1:LKKeyChainとかをつかうと簡単ですね。 http://cocoadays.blogspot.jp/2011/05/ios-keychain-services-lkkeychain.html