このページは役に立ちましたか。
このページのコンテンツについての ご意見をお待ちしております
その他にご意見はありますか。
残り 1500 文字
エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 でデータを暗号化する方法

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

このトピックでは、Data Protection API (DPAPI) を使用して、パスワード、接続文字列、PIN などの機密データを Windows Phone アプリ内で暗号化および復号化する方法について説明します。

機密データを電話の分離ストレージ内に保存すると、セキュリティで保護できません。復号化キーが電話上に存在していれば、その復号化キーをどれだけうまく隠しても、暗号化によってデータのセキュリティを向上させることはできません。DPAPI は、ユーザー資格情報とデバイス資格情報を使用してデータを暗号化および復号化することで、暗号化キーを明示的に生成および格納することに伴う問題を解決します。Protect および Unprotect メソッドを通じて、DPAPI にアクセスするための ProtectedData クラスを使用できます。データの暗号化には Protect メソッドを使用し、復号化には Unprotect メソッドを使用します。Windows Phone デバイスでは、すべてのアプリが独自の暗号化キーを取得します。この暗号化キーは、アプリを最初に実行したときに作成されます。Protect および Unprotect を呼び出すと、復号化キーが暗黙的に使用され、すべてのデータがアプリにとってプライベートであり続けることが保証されます。アプリが更新された場合でも、キーは同じまま維持されます。

暗号化するデータが大量にあり、そのデータが Windows Phone のローカル データベースに格納されている場合は、個別のデータを暗号化するのではなく、データベース全体を暗号化します。データベース全体を暗号化するには、Password パラメーターを使用します。詳細については、「Windows Phone 8 のローカル データベース接続文字列」を参照してください。

この手順では、アプリを作成し、Protect メソッドを使用して PIN を暗号化し、分離ストレージに格納し、その後 Unprotect メソッドを使用して PIN を復号化します。

Protect メソッドは、暗号化するデータとエントロピー情報をパラメーターとして受け取ります。エントロピー情報とは、暗号の複雑さを強化するために指定できる追加のバイト配列です。複雑さを強化する必要がない場合は null に設定できます。このトピックでは null に設定します。Protect メソッドを使用するときにエントロピー値を指定する場合は、Unprotect メソッドを使用してデータを復号化するときにも同じ値を使用する必要があります。

Unprotect メソッドは、Protect メソッドを使用して暗号化されたデータと、データ暗号化の際に使用したエントロピー情報をパラメーターとして受け取ります。Protect メソッドと Unprotect メソッドで使用するデータ パラメーターおよびエントロピー パラメーターは、Byte 型にする必要があります。

アプリの準備

  1. Visual Studio で、[ファイル] メニューの [新しいプロジェクト] をクリックして新しいプロジェクトを作成します。

  2. [新しいプロジェクト] ウィンドウが表示されます。Visual C# のテンプレートを展開し、Windows Phone のテンプレートを選択します。

  3. Windows Phone アプリ のテンプレートを選択します。[名前] ボックスに選択した名前を入力します。

  4. [OK] をクリックします。Windows Phone のプラットフォームを選択するダイアログ ボックスが表示されます。

  5. [対象の Windows Phone OS バージョン] メニューで、[Windows Phone OS 7.1] が選択されていることを確認します。

  6. [OK] をクリックします。新しいプロジェクトが作成され、Visual Studio のデザイナー ウィンドウに MainPage.xaml が表示されます。

  7. MainPage.xaml で、LayoutRoot という名前のグリッドを次のコードで置き換えます。このコードにより、PIN を入力するための TextBox コントロールと、PIN を格納および取得するための 2 つのボタンが作成されます。

<!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="Encryption Example" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="app login page" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="auto" />
                <RowDefinition />
                <RowDefinition Height="auto" />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            
            <TextBlock Grid.Row="0" Text="Pin" Margin="10" />
            <TextBox x:Name="TBPin" Height="75" Width="300" HorizontalAlignment="Left" Margin="83,22,0,44" Grid.Row="1" />
            <Button x:Name="BtnStore" Content="Store" Grid.Row="1" Click="BtnStore_Click" Margin="-6,123,6,58" Grid.RowSpan="3" />
            <Button x:Name="BtnRetrieve" Content="Retrieve" Grid.Row="3" Click="BtnRetrieve_Click" Margin="-6,111,6,72" Grid.RowSpan="2" />
        </Grid>
    </Grid>

PIN を暗号化するには

  1. 次の using ディレクティブを MainPage.xaml.cs ファイルの先頭に追加します。

    using System.IO;
    using System.IO.IsolatedStorage;
    using System.Text;
    using System.Security.Cryptography;
    
    
  2. 以下のコードを MainPage クラスに追加して、プライベート文字列変数を作成します。この変数は、後で PIN を分離ストレージに格納するときに使用します。

    private string FilePath = "pinfile";
    
    
  3. 次のコードを MainPage クラスに追加して、BtnStore_Click イベント ハンドラーを作成します。このコードは、PIN を Byte に変換し、Protect メソッドを使用して暗号化を実行し、WritePinToFile() プライベート メソッドを使用して分離ストレージに格納します。

    private void BtnStore_Click(object sender, RoutedEventArgs e)
    {
        // Convert the PIN to a byte[].
        byte[] PinByte = Encoding.UTF8.GetBytes(TBPin.Text);
    
        // Encrypt the PIN by using the Protect() method.
        byte[] ProtectedPinByte = ProtectedData.Protect(PinByte, null);
    
        // Store the encrypted PIN in isolated storage.
        this.WritePinToFile(ProtectedPinByte);
    
        TBPin.Text = "";
    
    }
    
    
  4. 次のコードを MainPage クラスに追加して、WritePinToFile() という名前のプライベート メソッドを作成します。このメソッドは、パラメーターとして Byte 型の暗号化された PIN を受け取ります。その後、PIN をアプリの分離ストレージ内のファイルに格納します。

    private void WritePinToFile(byte[] pinData)
    {
        // Create a file in the application's isolated storage.
        IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();
        IsolatedStorageFileStream writestream = new IsolatedStorageFileStream(FilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write, file);
    
        // Write pinData to the file.
        Stream writer = new StreamWriter(writestream).BaseStream;
        writer.Write(pinData, 0, pinData.Length);
        writer.Close();
        writestream.Close();
    }
    
    

データを復号化するには

  1. 次のコードを MainPage クラスに追加して、BtnRetrieve_Click イベント ハンドラーを作成します。このコードは、PIN を分離ストレージから取得し、Unprotect メソッドを使用して復号化を実行し、文字列に変換します。次に、PIN がテキスト ボックスに表示されます。分離ストレージから PIN を取得するプロセスは、ReadPinFromFile() という名前のプライベート メソッド内に実装します。

    private void BtnRetrieve_Click(object sender, RoutedEventArgs e)
    {
        // Retrieve the PIN from isolated storage.
        byte[] ProtectedPinByte = this.ReadPinFromFile();
    
        // Decrypt the PIN by using the Unprotect method.
        byte[] PinByte = ProtectedData.Unprotect(ProtectedPinByte, null);
    
        // Convert the PIN from byte to string and display it in the text box.
        TBPin.Text = Encoding.UTF8.GetString(PinByte, 0, PinByte.Length);
    
    }
    
    
  2. 次のコードを MainPage クラスに追加して、ReadPinFromFile() という名前のプライベート メソッドを作成します。このメソッドは、WritePinToFile() メソッドで作成したファイルにアクセスし、そのファイルから PIN を読み取ります。

    private byte[] ReadPinFromFile()
    {
        // Access the file in the application's isolated storage.
        IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();
        IsolatedStorageFileStream readstream = new IsolatedStorageFileStream(FilePath, System.IO.FileMode.Open, FileAccess.Read, file);
    
        // Read the PIN from the file.
        Stream reader =  new StreamReader(readstream).BaseStream;
        byte[] pinArray = new byte[reader.Length];
    
        reader.Read(pinArray, 0, pinArray.Length);
        reader.Close();
        readstream.Close();
    
        return pinArray;
    }
    
    

表示:
© 2015 Microsoft