DataSet ConnectionString 암호화 문제

DataSet.xsd를 활용해서 DB(MSSQL) 접근 과정에서의 문제를 해결하고자 글을 쓰게 됐습니다.

DataSet.xsd는 DB에 연결하여 테이블 구조를 자동으로 작성 해주는 기능이 있습니다. 해당 기능을 사용하는 경우 DB 연결을 위한 연결 문자열이 프로젝트 내 Settings에 저장되는 로직이 포함되어 있습니다.

기존 방식에서는 연결 문자열을 암호화 해 관리했기 때문에 문제가 없었지만, 이 방법 대로라면 Settings에 평문이 저장되는 관계로 보안이 허술해질 수 있다는 판단입니다. 그래서 Settings에 저장된 연결 문자열을 지우고 아래와 같이 프로젝트 코드를 변경하였습니다.

  1. DataSet.Designer.cs 파일을 보면 InitConnection() 함수 내에 ConnectionString을 초기화 하는 코드가 들어있습니다.
  2. 해당 연결 문자열을 Settings의 연결 문자열에서 기존 방식의 암호화된 연결 문자열을 복호화 해 넘기는 방식으로 코드를 변경합니다.

이 방법으로 런타임의 문제는 해결하였으나, 이렇게 Settings에 저장된 연결 문자열을 지우게 되면 데이터셋 디자이너에서 제공하는 기능에 오류가 발생합니다.

아래는 DB에 연결해 자동으로 구조가 만들어진 테이블에서 오른쪽마우스(context-menu)/구성 기능을 사용했을 때 발생하는 문제입니다.

연결해서 접근해야 하는데 연결 문자열이 없으니 이런 오류가 발생하는 것이 자명함과는 별개로, 암호화된 연결 문자열을 사용하면서도 디자이너 기능을 사용함에 있어 위와 같은 문제를 경험하지 않으려면 어떻게 해야하는지 의견을 여쭙고자 합니다.

  1. 데이터 셋 디자이너에서 프로젝트의 Settings를 사용하지 않고 코드에서 암호화 된 문자열을 사용하도록 하는 방법이 있는지?
  2. 위와 같은 방법이 없다면 개발 시점엔 평문을, 릴리즈 과정에서는 암호화된 문자열을 사용하도록 구성하는 것이 옳아 보이는데, 이게 최선의 방법인지?
  3. DataSet.xsd를 사용할 때 연결 문자열 관리에 있어 주로 사용하는 방법이 있는지?

정도 여쭙고 싶습니다.

1개의 좋아요
#if DEBUG
    Console.WriteLine("Debug version");
#endif

사용자 머신에서 실행되는 단독 앱이라면, 파일에 접근 가능한 사람은 누구든 원본 문자열을 볼 수 있어, 보안이 전혀 없는 상태입니다.

원본 문자열이 소스 코드에 있든, 별도의 파일에 저장되어 있든 상관 없이 말이죠.

보안과 상관 없이, 시스템 설정 파일에 문제가 생기면 시스템이 정상 동작하지 않는 것은 당연한 이치입니다.
이 설정 파일이 손상되지 않도록 시스템을 보호하거나, 손상을 발견하면 앱이 우아하게(gracefully) 종료될 수 있도록 조치를 취해야 합니다.

데이터 보안을 유지하는 가장 좋은 방법은 원본 데이터를 사용자 측에 두지 않는 것입니다.

이를 위한 가장 원시적인 방법은 앱 실행 초기에 보안 데이터, 예를 들면 데이터 베이스 계정과 비밀 번호를 사용자로부터 입력받는 것입니다.

좀 더 복잡한 설계 방식은 Azure Vault 와 같은 외부 서비스를 이용하거나, 별도의 백엔드를 두거나, 제 3 자 인증(OAuth, OIDC) 서비스를 이용하는 것입니다.

1개의 좋아요

저도 찾아보니 Winform 프로젝트에서 암호화 된 connectionString을 이용한 DataSet.xsd 디자이너 사용이 불가능하다는 쪽으로 글이 보였습니다.

BigSquare님께서 주셨던 Azure Vault나 백엔드, 제3자 인증의 경우에는 프로젝트에서 사용하기에 제약이 많은지라 사용할 수 없을것 같습니다.
그라목손님께서 주셨던 전처리 지시자로 차단하는 방식의 경우에 Release/Debug별로 구분해 빌드하면 결과 파일에는 제외되도록 가능했는데 아무래도 형상관리툴에는 기록이 남다보니 적절치 않은 것으로 결론 내려졌습니다.

두 분 다 시간 내 답변 달아주셔서 감사합니다.

1개의 좋아요