본문 바로가기

.NET Framework/C# 2.0 Quick Look

[ConfigurationManager] 02:ConnectionString 암호화/복호화

 회차
 01. ConfigurationManager - Overview of ConfigurationManager Class

 02. ConfigurationManager - Practical use of ConnectionString to encrypt

02| ConnectionString 암호화 / 복호화
이전 회차에서 ConfigurationManager 클래스에 대해서 살펴보고 사용방법에 대해서 알게 되었습니다.
이번회차에서는 ConnectionString 문자열을 어떻게 관리할수 있을지 살펴보려고하는데요.
DB연결 문자열 부터 복잡한 설정 정보를 특별한 보안조치 없이 *.config에 설정을 하고 사용하게 된다면 다음과 같이 정보들은 그대로 노출하게 됩니다. 


그정보가 정말 중요한 정보라면 암호화 작업이 필요하지 않을까 싶습니다.

" 어? 암호화 배우지도 않았는데? 어떻게 구현하지? " , " 암호학은 배웠는데. 구현하기가 어려워!!! "
  다행이 구현에 어려움이 없이 System.Configuration 어셈블리의 제공으로 암호화/복호화를 쉽게 도와주는 메소드가 존재를 합니다.

SectionInformation 클래스에 대해서 소개를 하겠습니다.

SectionInformation 클래스
 - ProtectSection(암호화)
 - UnprotectSection(복호화)

우선 암호화 부터 먼저 살펴보도록 하겠습니다.

* ProtectSection(암호화 하기)
ProtectSection 메소드 별칭부터 섹션을 보호한다라는 의미를 가지고 있는데요. 별칭답게 섹션을 암호화하도록 표시하여 해당 섹션이 디스크에 함호된 형태로 기록을 하는 메소드입니다.

그럼 쉽다고 했는데. 형태가 어떻게 되나요?

public void ProtectSection (string protectionProvider)


메소드 형태를 살펴보니 단순한 형태였습니다.

이미 눈치 채신분들도 계시겠지만 매개변수 명칭이 무언가를 의미를 가지고 있어 보입니다.
그렇습니다. 이 파라미터의 쓰임은  사용할 보호 공급자의 이름을 지칭하는데요.

기본적으로 다음 보호 공급자로 포함하고 있습니다.
- DPAPIProtectedConfigurationProvider
- RSAProtectedConfigurationProvider

기본 제공 프로바이더를  차이점을 설명 해드릴려고 했는데. MSDN을 검색해보니  너무나 자세히 제공을 하고있네요.

* DpapiProtectedConfigurationProvider

Windows 기본 제공 암호화 서비스를 사용하며, 컴퓨터별 보호 기능이나 사용자 계정별 보호 기능을 사용하도록 구성될 수 있습니다. 컴퓨터별 보호 기능은 익명 서비스에 유용하지만 보안 수준이 낮습니다. 사용자 계정별 보호 기능은 특정 사용자 ID로 실행되는 서비스에서 사용할 수 있습니다.


 * RsaProtectedConfigurationProvider

클래스를 사용하면 구성 파일에 저장된 민감한 정보를 암호화할 수 있으므로 이러한 정보에 무단으로 액세스하지 못하도록 하는 데 도움이 됩니다.


그럼 본격적으로 구성파일을 암호화 해보도록 하겠습니다. 코드를 살펴보도록 하겠습니다.

[코드] 구성 파일 암호화 하기

Configuration config = 
                      
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

ConfigurationSection section = config.ConnectionStrings;

 

if (section != null)

{

      if (!section.SectionInformation.IsProtected && !section.ElementInformation.IsLocked)

{
            
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");

            section.SectionInformation.ForceSave = true;

            config.Save(ConfigurationSaveMode.Full);

}

}


실제 암호화 하는 메소드는 다음과 같습니다.

section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");


코드 한번 간단하고 파워풀 하지 않나요?  그럼 결과는 어떻게 나왔을까요??

[결과] DataProtectionConfigurationProvider 기법으로 암호화


프로바이더를 변경해보도록 하겠습니다.
DataProtectionConfigurationProvider -> RsaProtectedConfigurationProvider
이제는  프로바이더 대신 으로 변경 해보도록 하겠습니다.

실제 암호화 하는 코드는 다음과 같습니다.
section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");


바꿔서 빌드를 하고 실행을 하였는데? 혹시 다음과 화면 나타나시는분 없으신가요?


" 왠 오류야?! 잘못 알려준거 아니야?  "

런타임 에러가 나타났다면 곧 컴퓨터가 포맷이 될것입니다.!!! 푸식.. ^___^

앗 농담이에요 =ㅁ=//

XP 사용자시라면 아무런 오류 없이 실행이 가능합니다만
실행 환경이 UAC(User Account Control)를 지원하는 Windows Vista 이상 이시라면 위와같이 에러가 발생하게 됩니다. 아무쪼록 권한 상승이 필요하기에 권한상승을 하도록 하겠습니다. 


Test 용도로 해당 프로젝트를 개발중이기 때문에 Visual Studio 2010 권한 상승을 하게 되었습니다.
여러분들은 그냥 실행 파일에 직접 권환 상승 하시거나 UAC를 권환 상승하도록 프로그램화 하여  배포 하시면 됩니다.

권한 상승이 이뤄졌다면 다시 RsaProtectedConfigurationProvider 제공자의 결과화면을 보도록 하겠습니다.

[결과] RsaProtectedConfigurationProvider 기법으로 암호화

방법을 이제 아셨으니 중요한 정보를 노출에 대해서 걱정 안하셔도 됩니다.
이렇게 암호화 하는 방법을 알았다면 이제는 복호화를 해야겠죠?

* UnprotectSection(복호화)
우선 메소드 형태부터 살펴보도록 하겠습니다.
public void UnprotectSection()

매개변수를 가지지 않은 구조로 가지고 있는데요.

복호화하기 위해 코드는 다음과 같습니다.

[코드] 구성 파일 복호화 하기

Configuration config = 
                      
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

ConfigurationSection section = config.ConnectionStrings;

 

if (section != null)

{

      if (section.SectionInformation.IsProtected)

{

           section.SectionInformation.UnprotectSection();

           section.SectionInformation.ForceDeclaration(true);

           section.SectionInformation.ForceSave = true;

           config.Save(ConfigurationSaveMode.Full)

}

}


연결된 구성 섹션이 보호되는지 여부를 판단하여 보호 되고 있으면 True를 반환할것이며 보호 되고 있지 않으면 false를 반환하게 됩니다. 

정상적으로 복호화가 되었는지 결과 하면을 보도록 하겠습니다.


정말 쉽게 암호화하고 복호화 하는 방법에 대해서 알아보았습니다.
이제 여러분들의 몫에 달렸네요 ^^

마지막으로 주의 하실점은 RsaProtectedConfigurationProvider를 사용하실때
RSA 암호화 방법은 보완 수준이 높지만 RSA 원리를 그대로 적용하기 때문에 만약 암호화된 구성파일을 복구화 하려고 할때 개인키를 가지고 있지 않으시면 복구 하실수 없으므로 주의가 필요합니다.

그외 보호되는 구성 섹션에 대한 자세한 내용은 아래 URL에서 구성 정보 암호화를 참조하십시오.
http://msdn.microsoft.com/ko-kr/library/53tyfkaw(v=VS.85).aspx


* 참고 문헌
- http://msdn.microsoft.com/ko-kr/library/ms134260(v=VS.85).aspx
- http://msdn.microsoft.com/ko-kr/library/system.configuration.sectioninformation_methods(v=VS.85).aspx

포스팅을 마치며...


이번 포스팅는 유익한 정보가 되셨는지 모르겠네요. ^^;;
무더위 준비 잘하시고 항상 좋은 하루 되세요 : )
감사합니다.

정은성 드림