ASP.NET Core의 용도 문자열
IDataProtectionProvider
를 사용하는 구성 요소는 CreateProtector
메서드에 고유한 용도 매개 변수를 전달해야 합니다. 용도 매개 변수는 루트 암호화 키가 동일한 경우에도 암호화 소비자 간의 격리를 제공하므로 데이터 보호 시스템의 보안에 내재되어 있습니다.
소비자가 용도를 지정하는 경우 용도 문자열이 루트 암호화 키와 함께 사용되어 해당 소비자에 고유한 암호화 하위 키를 파생시킵니다. 이렇게 하면 소비자를 애플리케이션의 다른 모든 암호화 소비자로부터 격리시킵니다. 다른 구성 요소에서 해당 페이로드를 읽을 수 없으며 다른 구성 요소의 페이로드를 읽을 수 없습니다. 이 격리를 통해 구성 요소에 대한 부적합한 전체 공격 범주가 렌더링됩니다.
위의 다이어그램에서 IDataProtector
인스턴스 A 및 B는 서로의 페이로드를 읽을 수 없습니다.
용도 문자열은 비밀로 지정할 필요가 없습니다. 잘 작동하는 다른 구성 요소는 동일한 용도 문자열을 제공하지 않는다는 점에서 고유해야 합니다.
팁
데이터 보호 API를 사용하는 구성 요소의 네임스페이스 및 형식 이름을 사용하는 것이 좋은 방법입니다. 실제로 이 정보는 충돌하지 않습니다.
minting 전달자 토큰을 담당하는 Contoso에서 작성한 구성 요소는 용도 문자열로 Contoso.Security.BearerToken을 사용할 수 있습니다. 또는 더 잘 사용 가능합니다. Contoso.Security.BearerToken.v1을 용도 문자열로 사용할 수 있습니다. 버전 번호를 추가하면 이후 버전에서 해당 용도로 Contoso.Security.BearerToken.v2를 사용할 수 있으며, 다른 버전은 페이로드 이동처럼 완전히 격리됩니다.
CreateProtector
에 대한 용도 매개 변수가 문자열 배열이기 때문에 위의 항목은 대신 [ "Contoso.Security.BearerToken", "v1" ]
로 지정할 수 있습니다. 이를 통해 용도 계층을 설정하고 데이터 보호 시스템으로 다중 테넌트 시나리오의 가능성을 열 수 있습니다.
Warning
구성 요소는 신뢰할 수 없는 사용자 입력이 용도 체인의 유일한 입력 원본인 것을 허용하지 않습니다.
예를 들어 보안 메시지의 저장을 담당하는 구성 요소 Contoso.Messaging.SecureMessage를 생각해 보세요. 보안 메시징 구성 요소가 CreateProtector([ username ])
를 호출하는 경우 악의적인 사용자가 CreateProtector([ "Contoso.Security.BearerToken" ])
를 호출하는 구성 요소를 가져오기 위해 "Contoso.Security.BearerToken"이라는 사용자 이름이 있는 계정을 만들 수 있습니다. 따라서 보안 메시징 시스템은 인증 토큰으로 인식될 수 있는 mint 페이로드로 실수로 발생합니다.
메시징 구성 요소에 대한 더 나은 용도 체인은 CreateProtector([ "Contoso.Messaging.SecureMessage", $"User: {username}" ])
이며, 적절한 격리를 제공합니다.
제공하는 격리 및 IDataProtectionProvider
, IDataProtector
및 용도의 동작은 다음과 같습니다.
지정된
IDataProtectionProvider
개체의 경우CreateProtector
메서드는 개체를 생성한IDataProtectionProvider
개체와 메서드에 전달된 용도 매개 변수 모두에 고유하게 연결된IDataProtector
개체를 생성합니다.용도 매개 변수는 Null이 아니어야 합니다. (용도가 배열로 지정된 경우 배열의 길이가 0이 아니어야 하고 배열의 모든 요소가 Null이 아니어야 함을 의미합니다.) 빈 문자열 용도는 기술적으로 허용되지만 권장되지 않습니다.
두 가지 용도 인수는 동일한 순서로 동일한 문자열을 포함하는 경우에만 동일합니다(서수 비교자 사용). 단일 용도 인수는 해당하는 단일 요소 용도의 배열과 동일합니다.
두
IDataProtector
개체는 동일한 용도 매개 변수를 사용하여 동일한IDataProtectionProvider
개체에서 만들어진 경우에만 동일합니다.지정된
IDataProtector
개체의 경우Unprotect(protectedData)
에 대한 호출은 해당IDataProtector
개체에 대한protectedData := Protect(unprotectedData)
인 경우에만 원래unprotectedData
를 반환합니다.
참고 항목
일부 구성 요소는 다른 구성 요소와 충돌하는 것으로 알려진 용도 문자열을 의도적으로 선택하는 경우를 고려하지 않습니다. 이러한 구성 요소는 기본적으로 악의적인 것으로 간주되며, 이 시스템은 악의적인 코드가 작업자 프로세스 내에서 이미 실행되고 있는 경우 보안을 보장하기 위한 것이 아닙니다.
ASP.NET Core