Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os componentes que consomem IDataProtectionProvider devem passar um parâmetro de finalidade exclusivo para o CreateProtector método. O parâmetro de finalidade é inerente à segurança do sistema de proteção de dados, pois fornece isolamento entre consumidores criptográficos, mesmo que as chaves criptográficas raiz sejam as mesmas.
Quando um consumidor especifica uma finalidade, a cadeia de caracteres de finalidade é usada junto com as chaves criptográficas raiz para derivar subchaves criptográficas exclusivas para esse consumidor. Isso isola o consumidor de todos os outros consumidores criptográficos no aplicativo: nenhum outro componente pode ler seus conteúdos e não pode ler os conteúdos de nenhum outro componente. Esse isolamento também torna inviáveis categorias inteiras de ataque ao componente.
No diagrama acima, IDataProtector as instâncias A e B não podem ler as cargas umas das outras, apenas as próprias.
A cadeia de caracteres de finalidade não precisa ser secreta. Ele deve ser simplesmente exclusivo no sentido de que nenhum outro componente bem comportado fornecerá a mesma cadeia de caracteres de finalidade.
Dica
Usar o namespace e o nome do tipo do componente que consome as APIs de proteção de dados é uma boa regra geral, pois, na prática, essas informações nunca entrarão em conflito.
Um componente criado pela Contoso, responsável por gerar tokens de portador, pode usar Contoso.Security.BearerToken como sua string de finalidade. Ou, ainda melhor, pode usar Contoso.Security.BearerToken.v1 como sua cadeia de caracteres de finalidade. Acrescentar o número de versão permite que uma versão futura use Contoso.Security.BearerToken.v2 como sua finalidade, e as diferentes versões seriam completamente isoladas umas das outras no que diz respeito às cargas.
Como o parâmetro de CreateProtector finalidade é uma matriz de cadeia de caracteres, o acima poderia ter sido especificado como [ "Contoso.Security.BearerToken", "v1" ]. Isso permite estabelecer uma hierarquia de finalidades e abre a possibilidade de cenários de vários locatários com o sistema de proteção de dados.
Aviso
Os componentes não devem permitir que a entrada de usuário não confiável seja a única fonte de entrada para a cadeia de finalidades.
Por exemplo, considere um componente Contoso.Messaging.SecureMessage responsável por armazenar mensagens seguras. Se o componente de mensagens seguras fosse chamado CreateProtector([ username ]), um usuário mal-intencionado poderia criar uma conta com o nome de usuário "Contoso.Security.BearerToken" na tentativa de fazer com que o componente chamasse CreateProtector([ "Contoso.Security.BearerToken" ]), fazendo com que o sistema de mensagens segura criasse conteúdos que poderiam ser percebidos como tokens de autenticação.
Uma cadeia de finalidades melhor para o componente de mensagens seria CreateProtector([ "Contoso.Messaging.SecureMessage", $"User: {username}" ]), que fornece isolamento adequado.
O isolamento fornecido e os comportamentos de IDataProtectionProvider, IDataProtector, e finalidades são os seguintes:
Para um determinado
IDataProtectionProviderobjeto, oCreateProtectormétodo criará umIDataProtectorobjeto exclusivamente vinculado ao objeto que oIDataProtectionProvidercriou e ao parâmetro de finalidades que foi passado para o método.O parâmetro de finalidade não deve ser nulo. (Se as finalidades forem especificadas como uma matriz, isso significa que a matriz não deve ter tamanho zero e todos os elementos da matriz devem ser não nulos.) Uma finalidade de cadeia de caracteres vazia é tecnicamente permitida, mas é desencorajada.
Dois argumentos de finalidade são equivalentes se e somente se contiverem as mesmas cadeias de caracteres (usando um comparador ordinal) na mesma ordem. Um único argumento de finalidade é equivalente à matriz de finalidades de elemento único correspondente.
Dois
IDataProtectorobjetos serão equivalentes se e somente se forem criados com base em objetos equivalentesIDataProtectionProvidercom parâmetros de finalidade equivalente.Para um objeto
IDataProtectordeterminado, uma chamada paraUnprotect(protectedData)retornará ounprotectedDataoriginal se e somente seprotectedData := Protect(unprotectedData)para um objeto equivalenteIDataProtector.
Observação
Não estamos considerando o caso em que algum componente escolhe intencionalmente uma cadeia de caracteres de finalidade que é conhecida por entrar em conflito com outro componente. Esse componente seria essencialmente considerado mal-intencionado e esse sistema não se destina a fornecer garantias de segurança caso o código mal-intencionado já esteja em execução dentro do processo de trabalho.