Tags: 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,同时必须保持一致。

About author
Disclaimer
The opinions and comments expressed herein are my own personal opinions and do not represent my employer's view in any way.
Comments
No comments.
Add comment
Title
Title is required.
Name
Name is required.
Email
Please input your personal email with valid format.
Comments
Please input comment content.
Captcha Refresh
Input captcha:

Subscription

Statistics

Locations of visitors to this page