在Windows Phone应用程序中加密解密数据

345 views 0 comments posted at about 7 years ago Raymond Tang Fahao

C# Windows Phone

在程序中加密解密是我们常要用到的功能,比如对密码,数据库连接字符串,PIN等的加密。虽然Windows Phone限制了应用程序仅能访问自己的独立存储,但是将重要数据以明文的形式存储在Isolated Storage依然是不安全的。在Windows Phone中加密解密通过Data Protection API (DPAPI)来实现。如果对加密解密有所了解的朋友会清楚,非对称的加密我们需要用到密钥对,而这往往需要我们自己生成,同时密钥本身需要存储,或者通过第三方机构颁布证书等的方式来验证信息的可靠性。而Windows Phone为我们简化了这个难题,每一个程序在第一次运行的时候就可以获得它自己的解密密钥。而我们只需要借助ProtectedData类的ProtectUnprotect方法分别实现加密和解密。对于数据类型的文件,直接可以对数据库加密,在连接字符串中使用Password参数即可。当然连接字符串本身也需要进行加密和解密,以防止密码泄露。

接下来我将演示如何在Windows Phone 应用程序中运用这两个方法。本文请参考MSDN文档http://msdn.microsoft.com/en-us/library/hh487164(v=VS.92).aspx

创建项目

  1. 创建Windows Phone 7项目EncryptionAndDecryption
  2. 添加TextBox控件textBoxData
  3. 添加buttonStore按钮,用于加密数据,将加密结果保存在内存中
  4. 添加buttonRetrieve按钮,用于解密数据,并将解密结果用弹出对话框显示。

最终ContentPanel部分的XAML如下:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <StackPanel Orientation="Vertical">
                <TextBox Height="71" Name="textBoxData" Text="" Width="460" Foreground="{StaticResource PhoneAccentBrush}" FontSize="{StaticResource PhoneFontSizeLarge}" />
                <Button Content="Store" Height="71" Name="buttonStore" Width="160" BorderBrush="{StaticResource PhoneAccentBrush}" Foreground="{StaticResource PhoneAccentBrush}" Click="ButtonStoreClick" />
                <Button Content="Retrieve" Height="71" Name="buttonRetrieve" Width="160" BorderBrush="{StaticResource PhoneAccentBrush}" Foreground="{StaticResource PhoneAccentBrush}" Click="ButtonRetrieveClick" />
            </StackPanel>
        </Grid>
    </Grid>

加密数据

当单击buttonStore后,加密textBlockData 中的数据,并保存在变量中,代码如下:

private byte[] _encryptedBytes;

        private void ButtonStoreClick(object sender, RoutedEventArgs e)
        {
            var sourceBytes = Encoding.UTF8.GetBytes(textBoxData.Text.Trim());
            _encryptedBytes = ProtectedData.Protect(sourceBytes, null);
        }

解密数据

当单击buttonRetrieve后,解密数据,代码如下:

private void ButtonRetrieveClick(object sender, RoutedEventArgs e)
       {
           if (_encryptedBytes == null) return;
           var bytes = ProtectedData.Unprotect(_encryptedBytes, null);
           if (bytes != null) MessageBox.Show(Encoding.UTF8.GetString(bytes, 0, bytes.Length));
       }

运行结果

输入Hello Windows Phone!

Encryption and Decryption in Windows Phone Application - 1Encryption and Decryption in Windows Phone Application -2

运行结果达到预期。

其它说明

通常情况下,我们需要将加密后的数据保存在独立存储中;Protect与Unprotect的第二个参数是信息熵,可以增加加密的复杂度,可以均为null,同时必须保持一致。

Add comment

Comments (0)

No comments yet.
In this Page