다음을 통해 공유


ASP.NET Core의 용도 문자열

사용하는 IDataProtectionProvider 구성 요소는 고유한 목적 매개 변수를 메서드에 CreateProtector 전달해야 합니다. 목적 매개 변수 는 루트 암호화 키가 같더라도 암호화 소비자 간에 격리를 제공하므로 데이터 보호 시스템의 보안에 내재되어 있습니다.

소비자가 용도를 지정하면 용도 문자열이 루트 암호화 키와 함께 사용되어 해당 소비자에게 고유한 암호화 하위 키를 파생합니다. 이렇게 하면 소비자를 애플리케이션의 다른 모든 암호화 소비자와 격리합니다. 다른 구성 요소는 해당 페이로드를 읽을 수 없으며 다른 구성 요소의 페이로드를 읽을 수 없습니다. 또한 이 격리는 구성 요소에 대한 전체 범주의 공격을 불가능하게 합니다.

용도 다이어그램 예제

위의 IDataProtector 다이어그램에서 인스턴스 A와 B는 서로의 페이로드만 읽을 수 없습니다 .

용도 문자열은 비밀일 필요가 없습니다. 잘 작동하는 다른 구성 요소가 동일한 용도의 문자열을 제공하지 않는다는 점에서 고유해야 합니다.

팁 (조언)

데이터 보호 API를 사용하는 구성 요소의 네임스페이스 및 형식 이름을 사용하는 것이 좋습니다. 실제로 이 정보는 충돌하지 않습니다.

전달자 토큰을 채굴하는 Contoso 작성 구성 요소는 Contoso.Security.BearerToken을 용도 문자열로 사용할 수 있습니다. 또는 - 더 좋게는 - Contoso.Security.BearerToken.v1을 용도 문자열로 사용할 수 있습니다. 버전 번호를 추가하면 향후 버전이 Contoso.Security.BearerToken.v2를 그 목적대로 사용할 수 있게 되며, 페이로드에 관해서는 각 버전이 서로 완전히 독립적으로 격리됩니다.

용도 매개 변수는 문자열 배열이므로 위의 매개 변수 CreateProtector 를 대신 .로 [ "Contoso.Security.BearerToken", "v1" ]지정할 수 있습니다. 이렇게 하면 목적의 계층 구조를 설정할 수 있으며 데이터 보호 시스템을 사용하여 다중 테넌트 시나리오가 발생할 수 있습니다.

경고

구성 요소는 신뢰할 수 없는 사용자 입력이 목적 체인에 대한 유일한 입력 원본이 되도록 허용해서는 안 됩니다.

예를 들어 보안 메시지 저장을 담당하는 Contoso.Messaging.SecureMessage 구성 요소를 고려합니다. 보안 메시징 구성 요소가 CreateProtector([ username ])을(를) 호출할 경우, 악의적인 사용자가 "Contoso.Security.BearerToken"이라는 사용자 이름으로 계정을 만들어 구성 요소가 CreateProtector([ "Contoso.Security.BearerToken" ])을(를) 호출하도록 유도할 수 있으며, 이로 인해 보안 메시징 시스템이 인증 토큰으로 인식될 수 있는 페이로드를 실수로 생성할 수 있습니다.

메시징 구성 요소에 대한 더 나은 목적 체인은 적절한 격리를 제공하는 체인입니다 CreateProtector([ "Contoso.Messaging.SecureMessage", $"User: {username}" ]).

IDataProtectionProvider, IDataProtector에 의해 제공되는 격리와 그 행동 및 용도는 다음과 같습니다.

  • 지정된 IDataProtectionProvider 개체의 경우 메서드는 CreateProtector 개체를 만든 개체와 메서드에 전달된 목적 매개 변수 모두 IDataProtector 에 고유하게 연결된 개체를 만듭니 IDataProtectionProvider 다.

  • 용도 매개 변수는 null이 아니어야 합니다. (용도를 배열로 지정하면 배열 길이가 0이 아니고 배열의 모든 요소가 null이 아니어야 합니다.) 빈 문자열 용도는 기술적으로 허용되지만 권장되지 않습니다.

  • 두 가지 용도의 인수는 동일한 순서로 동일한 문자열(서수 비교자 사용)을 포함하는 경우에만 동일합니다. 단일 용도 인수는 해당 단일 요소 용도 배열과 동일합니다.

  • IDataProtector 개체는 동일한 용도의 매개 변수를 사용하여 동일한 IDataProtectionProvider 개체에서 만들어진 경우에만 동일합니다.

  • 지정된 IDataProtector 개체의 경우, 동등한 IDataProtector 개체에 대한 protectedData := Protect(unprotectedData)일 때에만 Unprotect(protectedData) 호출이 원래 unprotectedData을(를) 반환합니다.

비고

일부 구성 요소가 의도적으로 다른 구성 요소와 충돌하는 것으로 알려진 목적 문자열을 선택하는 경우는 고려하지 않습니다. 이러한 구성 요소는 기본적으로 악의적인 것으로 간주되며, 이 시스템은 악의적인 코드가 작업자 프로세스 내에서 이미 실행되고 있는 경우 보안을 보장하기 위한 것이 아닙니다.