此页面有用吗?
您对此内容的反馈非常重要。 请告诉我们您的想法。
更多反馈?
1500 个剩余字符
MSDN Library
信息
您所需的主题如下所示。但此主题未包含在此库中。

如何加密 Windows Phone 8 的数据

2014/6/18

适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

本主题将会向您显示如何通过使用数据保护 API (DPAPI) 加密和解密 Windows Phone 应用中的机密数据(如密码、连接字符串和 PIN)。

将机密数据保存在手机的独立存储中并不安全。如果解密密钥驻留在手机上,则无论将密钥隐藏得多好,对数据进行加密也不会提高安全性。DPAPI 使用用户和设备凭据对数据进行加密和解密,从而解决了显式生成和存储加密密钥的问题。您可以使用 ProtectedData 类,它可以通过 ProtectUnprotect 方法提供对 DPAPI 的访问。您可以使用 Protect 方法对数据进行加密,并使用 Unprotect 方法对数据进行解密。在 Windows Phone 设备上,每个应用都会获取自己的解密密钥,当您首次运行应用时,将会创建该密钥。调用 ProtectUnprotect 将会隐式使用解密密钥,并可以确保所有数据保持为应用专用。该密钥还可以保留在应用的更新中。

如果您有大量数据需要加密,并且这些数据存储在 Windows Phone 的本地数据库中,请对整个数据库进行加密,而不要对每条数据逐个加密。若要对整个数据库进行加密,请使用 Password 参数。有关更多信息,请参见 Windows Phone 8 的本地数据库连接字符串主题。

在此过程中,您将创建应用,使用 Protect 方法对 PIN 进行加密,将其存储在独立存储中,然后通过 Unprotect 方法对其进行解密。

Protect 方法将要加密的数据和熵信息视为参数。熵信息是一个额外的字节数组,您可以通过指定它来增加加密的复杂性。您可以将其设置为 null,即不具有其他复杂性。在本主题中,它被设置为 null。如果您在使用 Protect 方法时提供了熵值,则在使用 Unprotect 方法对数据进行解密时,也必须使用此值。

Unprotect 方法会将通过使用 Protect 方法加密的数据和用于加密数据的熵信息视为参数。ProtectUnprotect 方法中的数据和熵参数均为 Byte 类型。

准备应用程序

  1. 在 Visual Studio 中,通过选择“文件” | “新建项目”菜单命令创建新的项目。

  2. 将显示“新建项目”窗口。展开“Visual C#”模板,然后选择“Windows Phone”模板。

  3. 选择 Windows Phone 应用  模板。用您选择的名称填写“名称”框。

  4. 单击“确定”。将显示 Windows Phone 平台选择对话框。

  5. “Windows Phone OS 目标版本”菜单中,确保“Windows Phone OS 7.1”处于选定状态。

  6. 单击“确定”。将创建一个新的项目,并且“MainPage.xaml”将在 Visual Studio 设计器窗口中打开。

  7. MainPage.xaml 中,使用以下代码替换名为 LayoutRoot 的网格。此代码创建一个用于输入 PIN 的 TextBox 控件,以及两个分别用于存储和检索该 PIN 的按钮。

<!--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. 向 MainPage.xaml.cs 的顶部添加以下 using 指令。

    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