이 항목은 아직 평가되지 않았습니다.- 이 항목 평가

Windows Phone 앱에서 데이터를 암호화하는 방법

2013-12-05

적용 대상: Windows Phone 8 | Windows Phone OS 7.1

 

이 항목에서는 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. 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 클래스에 추가하여 private 문자열 변수를 만듭니다. 이 변수는 이 프로시저 뒷부분에서 격리된 저장소에 PIN을 저장할 때 사용됩니다.

    private string FilePath = "pinfile";
    
    
  3. BtnStore_Click 이벤트 처리기를 만들려면 클래스의 MainPage 클래스에 다음 코드를 추가합니다. 이 코드는 PIN을 Byte로 변환하고, Protect 메서드를 사용하여 암호화한 다음 private 메서드 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()이라는 private 메서드를 만듭니다. 이 메서드는 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. BtnRetrieve_Click 이벤트 처리기를 만들려면 클래스의 MainPage 클래스에 다음 코드를 추가합니다. 이 코드는 격리된 저장소에서 PIN을 가져오고, Unprotect 메서드를 사용하여 암호를 해독한 다음 문자열로 변환합니다. 그러면 PIN이 텍스트 상자에 표시됩니다. 격리된 저장소에서 PIN을 검색하는 프로세스는 private 메서드 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()이라는 private 메서드를 만듭니다. 이 메서드는 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;
    }
    
    

표시:
© 2014 Microsoft. All rights reserved.