구성파일 (web.config) 암/복호화
기본적으로 제공되는 빌트 인 구성 암호화 제공자는 아래의 두가지 이다.
-
RsaProtectedConfigurationProvider
-
DataProtectionConfigurationProvider
이 제공자들은 machine.config에서 확인할 수 있다.
<configProtectedData defaultProvider="RsaProtectedConfigurationProvider">
<providers> <add name="RsaProtectedConfigurationProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,
System.Configuration, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" description="Uses RsaCryptoServiceProvider to
encrypt and decrypt" keyContainerName="NetFrameworkConfigurationKey"
cspProviderName="" useMachineContainer="true" useOAEP="false" /> <add
name="DataProtectionConfigurationProvider"
type="System.Configuration.DpapiProtectedConfigurationProvider,
System.Configuration, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" description="Uses CryptProtectData and
CryptUnProtectData Windows APIs to encrypt and decrypt"
useMachineProtection="true" keyEntropy="" /> </providers>
</configProtectedData>
예를 들어 /test/web.config 가 아래와 같고, 이를 암/복호화 하려면,
<connectionStrings> <add name="connstr" connectionString= "data
source=.\sqlexpress;initial catalog= northwind;integrated security=true" />
</connectionStrings>
vs.net command prompt에서
aspnet_regiis -pe "구성섹션이름" -app "가상디렉토리" [-site "사이트이름"]
IIS에서 여러 사이트를 호스팅하는 경우 -SITE 옵션을 명시해줍니다. 명시된 가상디렉토리 root의 web.config 파일 내 해당 구성섹션이 암호화 됨
aspnet_regiis -pe "connectionStrings" -app "/test"

암호화된 섹션은 아래와 같다.
<!-- 구성 섹션 암호화 테스트 용 -->
<CONFIGURATION> <APPSETTINGS /> <CONNECTIONSTRINGS
configProtectionProvider="RsaProtectedConfigurationProvider">
<ENCRYPTEDDATA xmlns="http://www.w3.org/2001/04/xmlenc#"
Type="http://www.w3.org/2001/04/xmlenc#Element"> <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>Ln9cewaXzKvsGLOWLKsTY3cMzfjYUNj1EvnoFZI4Gd+oLzLfE9Sy3e9nTtjITfurvF1M+VNmYrhiBkn2R9dFsXXeekacuRBfuzGDs3RFyRqXbknPP6BzpkNiScj5vcrUbwZT1j4XR4TD/qhFaY8FHXym7CA/2d1G3MOizfhwCs0=</CIPHERVALUE>
</CIPHERDATA> </ENCRYPTEDKEY> </KEYINFO> <CIPHERDATA>
<CIPHERVALUE>LqzsDVxT3HMiQE7m+joQ1b9pq2Eq6jE8w4ezbSL+Q3JC6OYZITXf6wg4UVq7V7cVa1goh9UtRhKifgzvoybkP6hOy+495p7ewr2ARCBbDgwdtL/Of39/jXGWBSrTcHgu9tVlpnJGN57iX9Je33QQ0xYu+8NhuXtIhCdmrSpBpMuld/jxNQoT4lDiwrfiVIu08xoeP4v/00TTwjy+RgvnHnc+W1QqypsQK58yiikhuc0=</CIPHERVALUE>
</CIPHERDATA> </ENCRYPTEDDATA> </CONNECTIONSTRINGS>
구성섹션을 다시 복호화
aspnet_regiis -pd "connectionStrings" -app "/test"
프로그래밍 적으로 구성섹션을 암호화 하려면,
Configuration config = WebConfigurationManager.
OpenWebConfiguration(Request.ApplicationPath); ConfigurationSection section =
config.ConnectionStrings;
if (!section.SectionInformation.IsProtected)
{
< /STRONG > section.SectionInformation.ProtectSection
("RsaProtectedConfigurationProvider"); section.SectionInformation.ForceSave
= true;
config.Save(ConfigurationSaveMode.Modified);
}
프로그래밍 적으로 구성섹션을 복호화 하려면,
Configuration config = WebConfigurationManager.
OpenWebConfiguration(Request.ApplicationPath); ConfigurationSection section =
config.ConnectionStrings;
if (section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
section.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Modified);
}
이런식으로 간단하게 구성섹션을 암/복호화 할 수 있다.
끝.