시나리오 : 다른 고객을 위해 다른 컴퓨터에 배포되는 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 파일을 암호화하고 응용 프로그램을 배포하고 다른 컴퓨터에서 읽을 수있는 올바른 방법을 찾고 있습니다.
도움을 주시면 감사하겠습니다.
나는 이것에 관해 읽은 것을 기억하지만 그 생각을 버렸다. 구성 창을 암호화하면 생성 된 키가 레지스트리 내의 안전한 위치에 저장되므로 HKCU는 믿습니다. 따라서이 작업은 각 기계 및/또는 사용자에서 수행해야하며 출하 전에 수행 할 수 없습니다. –