내보내기(0) 인쇄
모두 확장

방법: Windows Phone 응용프로그램에서 데이터 암호화

2012-02-09

이 항목에서는 DPAPI(데이터 보호 API)를 사용하여 Windows Phone 응용프로그램에서 비밀번호, 연결 문자열 및 PIN과 같은 기밀 데이터를 암호화하고 해독하는 방법을 보여 줍니다.

휴대폰의 격리된 저장소에 기밀 데이터를 저장하면 안전하지 않습니다. 해독 키가 휴대폰에 저장되어 있다면 그 키가 얼마나 잘 숨겨져 있더라도 데이터 암호화의 보안 효과를 누릴 수 없습니다. DPAPI는 명시적으로 암호화 키를 생성하고 저장하는 문제를 해결하기 위해 데이터 암호화 및 해독에 사용자 및 휴대폰 자격 증명을 사용합니다. ProtectUnprotect 메서드를 통해 DPAPI에 대한 액세스를 제공하는 ProtectedData 클래스를 사용할 수 있습니다. Protect 메서드를 사용하여 데이터를 암호화하고 Unprotect 메서드를 사용하여 데이터를 해독합니다. Windows Phone 단말기에서 모든 응용프로그램은 처음 응용프로그램을 실행할 때 생성되는 고유한 암호 해독 키를 갖습니다. ProtectUnprotect를 호출하면 암호 해독 키가 암시적으로 사용되며 모든 데이터가 응용프로그램 전용으로 유지됩니다. 키는 응용프로그램 업데이트 후에도 지속됩니다.

암호화할 데이터의 양이 많은 경우 그리고 데이터가 Windows Phone용 로컬 데이터베이스에 저장되어 있는 경우 각각의 데이터를 암호화하지 않고 전체 데이터베이스를 암호화합니다. 전체 데이터베이스를 암호화하려면 Password 매개 변수를 사용합니다. 자세한 내용은 Windows Phone의 로컬 데이터베이스 연결 문자열을 참조하십시오.

이 절차에서는 응용프로그램을 만들고 Protect 메서드를 통해 PIN을 암호화하고 이를 격리된 저장소에 저장한 다음 Unprotect 메서드를 사용하여 해독합니다.

Protect 메서드는 암호화할 데이터와 엔트로피 정보를 매개 변수로 사용합니다. 엔트로피 정보는 암호화의 복잡성을 늘리기 위해 지정할 수 있는 추가 바이트 배열입니다. 복잡성을 더 추가하지 않으려면 null로 설정할 수 있습니다. 이 항목에서는 null로 설정됩니다. Protect 메서드를 사용할 때 엔트로피 값을 제공하는 경우, Unprotect 메서드로 데이터를 해독할 때도 이 값을 사용해야 합니다.

Unprotect 메서드는 Protect 메서드를 사용하여 암호화된 데이터와 데이터 암호화에 사용된 엔트로피 정보를 매개 변수로 사용합니다. ProtectUnprotect 메서드의 데이터 및 엔트로피 매개 변수는 byte[] 형식입니다.

응용프로그램 준비

  1. Windows Phone용 Visual Studio 2010 Express 에서 파일 | 새 프로젝트 메뉴 명령을 선택하여 새 프로젝트를 만듭니다.

  2. 새 프로젝트 창이 표시됩니다. Visual C# 템플릿을 확장하고 Windows Phone용 Silverlight 템플릿을 선택합니다.

  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을 저장하고 검색하기 위한 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