문제

SQL Server 2005, asp.net 및 ado.net을 사용하여 웹 응용 프로그램을 작성해야 합니다.이 애플리케이션에 저장된 사용자 데이터의 대부분은 암호화되어야 합니다(HIPAA 참조).

예전에는 암호화가 필요한 프로젝트의 경우 애플리케이션 코드에서 암호화/복호화를 진행했습니다.그러나 이는 일반적으로 비밀번호나 신용카드 정보를 암호화하기 위한 것이므로 몇 개의 테이블에 소수의 열만 포함됩니다.이 응용 프로그램의 경우 여러 테이블의 훨씬 더 많은 열을 암호화해야 하므로 특히 여러 암호화 유형에 대한 SQL Server 2005의 기본 지원을 고려할 때 암호화 책임을 데이터 계층으로 푸시하는 것이 더 나은 성능을 발휘할 것이라고 생각합니다.(누군가 실제적이고 경험적인 증거가 있다면 그렇지 않다고 확신할 수 있습니다.)

BOL에 문의했는데 Google 사용에 상당히 능숙합니다.따라서 나는 온라인 기사나 MSDN 문서에 대한 링크를 원하지 않습니다(아마도 이미 읽었을 것입니다).

지금까지 제가 생각한 한 가지 접근 방식은 인증서를 사용하여 열리는 대칭 키를 사용하는 것입니다.

따라서 일회성 설정 단계는 다음과 같습니다(이론적으로는 DBA가 수행함).

  1. 마스터 키 생성
  2. 마스터 키를 파일로 백업하고, CD로 굽고, 오프사이트에 보관하세요.
  3. 마스터 키를 열고 인증서를 만듭니다.
  4. 인증서를 파일로 백업하고, CD로 굽고, 오프사이트에 저장하세요.
  5. 인증서를 사용하여 선택한 암호화 알고리즘으로 대칭 키를 만듭니다.

그런 다음 저장 프로시저(또는 Management Studio를 통한 인간 사용자)가 암호화된 데이터에 액세스해야 할 때마다 먼저 대칭 키를 열고 tsql 문이나 배치를 실행한 다음 대칭 키를 닫아야 합니다.

그런 다음 asp.net 응용 프로그램과 제 경우에는 응용 프로그램 코드의 데이터 액세스 계층에 관한 한 데이터 암호화가 완전히 투명합니다.

그래서 내 질문은 다음과 같습니다

  1. tsql 문/배치를 열고 실행한 다음 sproc 내에서 대칭 키를 모두 닫고 싶나요?내가 보는 위험은 tsql 실행에 문제가 발생하고 코드 sproc 실행이 키를 닫는 명령문에 도달하지 못하는 경우입니다.이는 SQL이 sproc이 실행된 SPID를 종료할 때까지 키가 열려 있음을 의미한다고 가정합니다.

  2. 대신 실행해야 하는 특정 프로시저에 대해 세 개의 데이터베이스 호출을 수행하는 것을 고려해야 합니까(암호화가 필요한 경우에만)?키를 열기 위한 한 번의 데이터베이스 호출, sproc를 실행하기 위한 두 번째 호출, 키를 닫기 위한 세 번째 호출입니다.(열린 키가 궁극적으로 닫힐 확률을 최대화하기 위해 각 호출은 자체 try catch 루프에 래핑됩니다.)

  3. 클라이언트 측 트랜잭션을 사용하려면 고려해야 할 사항이 있나요? 즉, 내 코드가 클라이언트이고 트랜잭션을 시작하고 여러 sproc을 실행한 다음 성공을 가정하여 트랜잭션을 커밋한다는 의미입니다.

도움이 되었습니까?

해결책

1) SQL 2005에서 TRY..CATCH 사용을 살펴보십시오.불행하게도 FINALLY는 없으므로 성공 사례와 오류 사례를 모두 개별적으로 처리해야 합니다.

2) (1)이 청소를 처리하는 경우에는 필요하지 않습니다.

3) SQL Server를 사용하는 클라이언트와 서버 트랜잭션에는 실제로 차이가 없습니다.Connection.BeginTransaction()은 서버에서 "BEGIN TRANSACTION"을 실행합니다(그리고 System.Transactions/TransactionScope는 분산 트랜잭션으로 승격될 때까지 동일한 작업을 수행합니다).트랜잭션 내에서 키를 여러 번 열거나 닫는 것과 관련된 문제에 대해서는 알아야 할 문제가 없습니다.

다른 팁

저는 옵션 3을 매우 좋아합니다.

어쨌든 다음과 같은 트랜잭션 인프라를 설정한다고 잠시 가정해 보십시오.

  1. 기존 트랜잭션이 시작되지 않은 경우 데이터 저장소에 대한 호출이 이루어질 때마다 해당 트랜잭션이 생성됩니다.
  2. 트랜잭션이 이미 존재하는 경우 해당 트랜잭션에 대한 데이터 저장소 후크를 호출합니다.이는 데이터베이스 저장/이동 이벤트로 인해 발생하는 비즈니스 규칙에 유용한 경우가 많습니다.즉.위젯을 판매할 때마다 WidgetAudit 테이블을 업데이트해야 한다는 규칙이 있는 경우 위젯이 판매되었음을 데이터 저장소에 알리는 것과 동일한 트랜잭션에서 위젯 감사 삽입 호출을 래핑하고 싶을 것입니다.
  3. 데이터 저장소에 대한 원래 호출자(1단계)가 완료될 때마다 트랜잭션을 커밋/롤백합니다. 이는 호출 중에 발생한 모든 데이터베이스 작업(try/catch/finally 사용)에 영향을 미칩니다.

이러한 유형의 트랜잭션이 생성되면 처음(트랜잭션이 열릴 때)에 열린 키를 추가하고 끝(트랜잭션이 끝나기 직전)에 키를 닫는 것이 간단해집니다.데이터 저장소에 대한 "호출"은 데이터베이스에 대한 연결을 여는 것만큼 비용이 많이 들지 않습니다.리소스를 소모하는 것은 실제로 SQLConnection.Open()과 같은 것입니다(ADO.NET이 리소스를 풀링하는 경우에도 마찬가지입니다).

이러한 유형의 코드에 대한 예를 원한다면 NetTiers를 살펴보는 것이 좋습니다.이는 방금 설명한 트랜잭션에 대한 매우 우아한 솔루션을 제공합니다(아직 염두에 두고 있는 것이 없다고 가정).

단 2센트.행운을 빌어요.

  1. @@error를 사용하여 SQL에서 sproc을 호출하는 동안 오류가 발생했는지 확인할 수 있습니다.

  2. 복잡하지 않습니다.

  3. 가능하지만 저는 SQL Server 자체에서 트랜잭션을 사용하는 것을 선호합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top