2011-12-20 3 views
4

시나리오 : 다른 고객을 위해 다른 컴퓨터에 배포되는 WPF 데스크톱 응용 프로그램이 있습니다. 응용 프로그램에 XML 구성 파일 'ApplicationConfiguration.xml'이 있습니다. 이 XML 파일에는 연결 문자열이 들어 있습니다. ApplicationConfiguration.xml 파일이 기본 응용 프로그램 exe와 함께 응용 프로그램의 설치 폴더에 복사되므로 이러한 연결 문자열을 암호화해야합니다.연결 문자열 RsaProtectedConfigurationProvider 전략

계획 전략 : 내 계획 전략은 설치 후 'ApplicationConfiguration.xml' 파일을 암호화하는 것이 었습니다. (필자는 설치하는 동안 그것을 할 수 있다면 모든 이상)

내가 시도 무엇

: 내가 사용자를 허용하는 간단한 윈폼 애플리케이션을 작성하기로 결정했습니다 설치 후 XML 파일을 암호화하는 전략가는 'ApplicationConfiguration.xml'을 찾아 간단히 버튼을 눌러 암호화하십시오. 이 작업을 수행하면 xml 구성 파일 형식으로 새 파일을 만들었습니다. 'ApplicationConfiguration.xml.Config'하지만 원래 은 'ApplicationConfiguration.xml' 파일은 여전히 ​​그대로 연결 문자열에 그대로 남아 ... 이제 .... 난에이 파일의 내용을 복사 할 때 내 ' ApplicationConfiguration.xml '파일이 프로그램이 정상적으로 작동 할 수있게되었습니다 ... 이제 xml은 암호화되어 기억됩니다. 그래서 .NET 4.0 프레임 워크는 WPF 애플리케이션에 더 이상 코드를 작성하지 않고 xml 파일을 DECRYPT 할 수 있습니다.

내가 게시 한
protected void EncryptConfig(Boolean bEncrypt) 
    { 
     string path = SelectedFilePath(); 

     Configuration config = ConfigurationManager.OpenExeConfiguration(path); 

     // Define the Rsa provider name. 

     const string provider = "RsaProtectedConfigurationProvider"; 

     // Get the section to protect. 

     ConfigurationSection connStrings = config.ConnectionStrings; 

     if (connStrings != null) 
     { 
      if (!connStrings.SectionInformation.IsProtected) 
      { 
       if (!connStrings.ElementInformation.IsLocked) 
       { 
        // Protect the section.    
        connStrings.SectionInformation.ProtectSection(provider); 
        connStrings.SectionInformation.ForceSave = true; 
        config.Save(ConfigurationSaveMode.Full); 
       } 
      } 
     } 

     MessageBox.Show("Config has been encrypted"); 
} 

예 출력 (더미 문자로 CipherData의 교체)

<?xml version="1.0" encoding="utf-8"?> 
<configuration>  
<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"> 
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" 
     xmlns="http://www.w3.org/2001/04/xmlenc#"> 
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> 
     <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
      <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> 
       <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> 
       <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
        <KeyName>Rsa Key</KeyName> 
       </KeyInfo> 
       <CipherData> 
        <CipherValue>skfjshsadfhsadkjfsadhfsadkhfdsafhsadkfhkljdfh=</CipherValue> 
       </CipherData> 
      </EncryptedKey> 
     </KeyInfo> 
     <CipherData> 
      <CipherValue>adfdsafdsafdsfdsafsadfsadfsadfsdfasfdsadfsafsadfdsf=</CipherValue> 
     </CipherData> 
    </EncryptedData> 
</connectionStrings> 

위의 코드에 의해 생성된다 : 아래

참조 코드는 암호화를 수행하는 그래서 위에서 한 일과 내가하려고하는 일에 대해 몇 가지 질문을했습니다.

1) 응용 프로그램이 WPF 응용 프로그램에 새 코드를 쓰지 않고도 암호화 된 연결 문자열을 읽을 수 있습니까? 그렇다면 내 컴퓨터에서 모든 암호화 처리를 수행하면 각 컴퓨터에서 암호화 된 연결 문자열을 읽을 수 있습니까? 나는 'Key'에 관한 글을 읽었고 keySName (Rsa Key)이 어디에서 왔는지 이해하지 못한다.

2) 왜 위의 코드 예제에서 xml 파일을 저장하면 새로운 'xml.config'파일이 만들어 집니까? 새로 생성 된 코드를 원래 applicationConfiguration.xml 파일에 수동으로 복사해야합니까?

그냥 추가, 나는 다음과 같은 코드를 사용하여 새 xml.config 파일의 암호를 해독 할 때 :

 connStrings.SectionInformation.UnprotectSection(); 
       config.Save(ConfigurationSaveMode.Full); 

은 .. 나는 다음과 같은 출력을 얻을를! 왜!:)

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<connectionStrings> 
    <clear /> 
    <add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
     providerName="System.Data.SqlClient" /> 
</connectionStrings> 
    </configuration> 

원래 3 개의 연결 문자열을 가져올 것으로 예상 했습니까?

기본적으로 연결 문자열의 xml 파일을 암호화하고 응용 프로그램을 배포하고 다른 컴퓨터에서 읽을 수있는 올바른 방법을 찾고 있습니다.

도움을 주시면 감사하겠습니다.

+0

나는 이것에 관해 읽은 것을 기억하지만 그 생각을 버렸다. 구성 창을 암호화하면 생성 된 키가 레지스트리 내의 안전한 위치에 저장되므로 HKCU는 믿습니다. 따라서이 작업은 각 기계 및/또는 사용자에서 수행해야하며 출하 전에 수행 할 수 없습니다. –

답변

0

.Net Encryption - 데이터 보호 API는 도움이되지 않으므로 컴퓨터/사용자 키로 로컬 암호화하도록 암호화되지 않은 상태로 보내야합니다.

가급적이면 사용 가능한 암호화 클래스를 사용하여 앱에 저장된 키로 암호화하고 아무도 소프트웨어를 분해하지 않기를 바랍니다.

+0

안녕 얘들 아, 그래, 내가 정상적으로 각 컴퓨터에 응용 프로그램을 설치하는 경우 ... 다음 작업을 할 것이라고 개별적으로 각 컴퓨터에 암호화 물건을 할 내 암호화 프로그램을 실행합니까? 이게 네가 말하는거야? 덕분에 – Kev

+0

@ Kev 사실 나는 이것이 권장 접근법이라고 말할 수 있습니다. 이것은 '설치 당'또는 '설치 중 암호화'와 같은 것으로 불립니다. DPAPI를 사용하면 가장 안전한 방법입니다. 프로그램을 설정하는 전형적인 방법은 msi 프로젝트에서 'Before or After Install 이벤트'(잘못된 이름을 용인하는 것)를 덮어 쓰고 거기에서 암호화 프로그램을 호출하는 프로그램을 프로그래밍하는 것입니다. 따라서 msi 파일이 실행되면 이벤트가 트리거되고 설치 프로세스 중에 구성 항목이 암호화됩니다. codeproject에 유용한 기사가있었습니다. 미안하지만, 링크가 있으면 편리합니다. – gmaran23