Pergunta

Estou querendo tentar amarrar a função Windows API CryptUnprotectData eo .net SecureString juntos da melhor maneira possível. CryptUnprotectData devolve uma estrutura DATA_BLOB consistindo de uma matriz de bytes e um comprimento de byte. No meu programa este será um Unicode UTF-16 string. SecureString tem um construtor que leva um char * e parâmetros de comprimento, então eu gostaria de ser capaz de fazer algo como:

SecureString ss = SecureString((char*)textBlob.pbData, textBlob.cbData / 2);

Isso funciona, exceto UTF-16 é de comprimento variável, então eu realmente não sei o que usar como argumento comprimento. O exemplo acima assume caracteres de 2 bytes (BMP), mas para outros planos que poderia ser de até 4 bytes. Eu preciso saber o número de UTF-16 caracteres na matriz de bytes. Qual é a melhor maneira de fazer isso sem copiar os valores em torno da memória (comprometendo assim a segurança). Estou pensando em zerar e libertando a matriz de bytes o mais rápido possível.

Foi útil?

Solução

A maioria das ofertas de API do Windows com UTF-16 pontos de código, tanto quanto eu estou ciente - em outras palavras, você tratar pares substitutos como dois pontos de código em vez de um único personagem. Dado que o construtor para SecureString está lidando com um ponteiro para valores System.Char .NET (que são UTF-16) Eu acho que o fragmento de código que você tem é bom - o número de elementos em pbData é metade seu tamanho em bytes.

Por exemplo, se pbData contido (apenas) um par substituto, cbData seria 4 e você ainda gostaria de passar em 2 como o segundo argumento - porque esse é o número de valores System.Char você está construindo o SecureString partir. O fato de que é um BMP não-caracteres Unicode é irrelevante para o número de UTF-16-valores System.Char é representado em.

(E sim, o suporte para dados não-BMP é um pouco de uma bagunça, e eu suspeito que muito poucas pessoas obtê-lo direito em todos os lugares. Tenho certeza de que não. Felizmente em muitos lugares você não precisa a preocupação ...)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top