2008-08-08 5 views
14

우리 팀에서 현재 개발중인 응용 프로그램에는 모든 데이터베이스 액세스를 수행하는 데 사용되는 DLL이 있습니다. 데이터베이스가 방화벽 뒤에 있고 도메인 서버가 아니기 때문에 응용 프로그램은 트러스트 된 연결을 사용할 수 없습니다. 따라서 연결 문자열에는 DB 사용자 이름과 암호가 필요합니다. DLL은 현재 하드 코딩 된 데이터베이스 연결 문자열을 가지고 있지만 어셈블리를 디스 어셈블 할 수 있고 사용자 이름과 암호가 열려있을 때 실행할 수 있기 때문에이 작업을 원하지 않습니다..NET DLL에 연결 문자열을 저장하는 가장 좋은 방법은 무엇입니까?

몇 가지 요구 사항 중 하나는 비밀번호를 몇 개월에 한 번씩 변경해야하므로 내부 사용자 기반으로 비밀번호를 변경해야한다는 것입니다.

암호를 저장하여 어셈블리에 저장하지 않고 전체 사용자에게 쉽게 배포 할 수있는 방법으로 암호를 저장하는 방법이 있습니까?

업데이트 : 답변 해 주신 모든 분들께 감사드립니다. 나는 몇 가지 질문에 대답하려고 노력할 것이다 ... 데이터 DLL은 ASP.NET WebForms와 VB.NET WinForms에서 모두 사용된다. 응용 프로그램은 자신의 구성 파일을 가질 수 있지만 DLL의 구성 파일에는 아무 것도 보지 못했습니다. 불행히도 직장에서 존 갤러 웨이 (Jon Galloway) 게시판에 올 수 없으므로 작동 여부를 판단 할 수 없습니다. 개발 관점에서 우리는 내부에서 웹 서비스를 사용하고 싶지는 않지만 내년에 제 3 자에게 웹 서비스를 제공 할 수 있습니다. 나는 우리가 방화벽을 통해 사용자를 인증 할 수 없기 때문에 가장이 효과가 있다고 생각하지 않습니다. 사용자 (또는 이전 사용자)가 공격자가 될 수 있으므로, 우리는 모든 사람으로부터 그것을 지켜 나가고 있습니다!

답변

9

확실하지 않지만 설정 파일에 넣고 설정 파일을 암호화 할 수 있습니다.

업데이트 : 응용 프로그램이 다음 당신의 web.config의 연결 문자열 섹션을 암호화하는 ASP.NET 응용 프로그램 인 경우 존 갤러웨이의 게시물을 here.

+0

업데이트가 더 이상 아무 것도 가리 키지 않습니다. 참조한 정보를 찾아이 대답에 넣으면 그럴 것입니다. 모든 시간 동안 (또는 스택 오버플로가 태양에 흡수되면 바로) –

+0

@JasonSperske - 링크를 업데이트했습니다. 나는 곧 요약 할 것이다. –

0

를 참조하십시오.

응용 프로그램이 여러 컴퓨터에서 실행되는 클라이언트 응용 프로그램 인 경우 연결 문자열을 로컬로 저장하는 대신 웹 서비스 또는 다른 종류의 보안 메커니즘을 사용하여 중앙에서 저장하는 것이 좋습니다. 이렇게하면 나중에 쉽게 업데이트 할 수 있으며 연결 문자열을 로컬에 저장하지 않게됩니다.

몇 가지 생각. 그렇지 않으면, 서버에 연결 문자열을 저장 "

lassevk @, 당신은 당신이 그뿐만 아니라 웹 연결에 보안이 필요하다는 것을 깨달을 때까지 웹 연결을 통해 그것을 획득은, 좋은 소리 :

업데이트 공격자는 프로그램을 가장하여 웹 연결과 대화 할 수 있습니다. "

웹 서비스의 보안은 암시 적입니다. 배포 유형에 따라 클라이언트 측 인증서와 같은 다양한 옵션이 있습니다.

1

나는 이것을 말하고 싶지 않지만 클라이언트 시스템에 무언가를 입력하자마자 해당 데이터에 대한 보안이 사라집니다.

프로그램에서 해당 문자열의 암호를 해독하려면 공격자가 동일한 작업을 수행 할 수 있다고 가정해야합니다. 프로그램에 디버거를 연결하는 것도 한 가지 방법입니다.

서버에 연결 문자열을 저장하고 웹 연결을 통해 연결 문자열을 가져 오는 것이 좋습니다. 웹 연결에서도 보안이 필요하다는 것을 알기 전까지는 소리가 잘 들립니다. 그렇지 않으면 침입자가 프로그램을 가장하여 상대방과 대화 할 수 있습니다. 웹 연결.

질문이 있습니다. 누구에게서 연결 문자열을 숨기고 있습니까? 사용자 또는 공격자? 그리고 사용자라면, 왜?

0

다른 아이디어가 있습니다. 가장은 항상 사용할 수 있습니다. 또한 엔터프라이즈 라이브러리 (공용 라이브러리)를 사용할 수 있습니다.

<section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
<enterpriseLibrary.ConfigurationSource selectedSource="Common"> 
<sources> 
    <add name="Common" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
    filePath="Config\Exception.config" /> 
</sources> 

0

.NET 이런 설정 값의 암호화를 지원한다. 설정 파일에 그대로 둘 수 있지만 암호화는 가능합니다.

0

모든 설정 정보를 구성 가능한 곳에 배포 할 수 있기를 원하지만 사실은 DLL에 편리한 DLL 설정 파일 중 하나를 가질 수 없다는 것입니다 뭔가 맞춤.

아마도 DLL에 어떤 책임이 있는지 다시 생각해 봐야합니다. 연결 문자열을 라이브러리 사용자가 전달하도록 요구하는 것이 가능할까요? DLL이 구성 파일을 읽는 것이 실제로 의미가 있습니까?

3

악의적 인 사용자가 설정 파일에서 자격 증명을 얻을 것이라고 가정합니다. 이는 사용자가 데이터베이스에 로그인하여 해당 사용자가 할 수있는 모든 작업을 수행 할 수 있음을 의미합니다. 따라서 사용자가 테이블에 직접 액세스하는 것처럼 나쁜 일은 할 수 없도록하십시오. 해당 사용자가 특정 저장 프로 시저 만 실행할 수 있도록하면 더 나은 모양이됩니다. 이것은 sprocs 빛나는 한 곳입니다.

+0

저는 항상 가능한 한 많은 방법으로 작업 한 웹 응용 프로그램의 SQL 로그인을 제한하려고합니다. –

0

몇 가지 옵션 :

  1. 의 Web.config에 저장하고 DLL에
  2. 스토어를 암호화 및 난독 화 (dotfuscator) (물론 암호화)의 web.config에서
  3. 스토어 하나는 데이터베이스 휴식 (다중을 사용해야하고 암호화/해독이 고통이되는 경우)