Domanda

Sono voler cercare di legare la funzione Windows API CryptUnprotectData e il SecureString .net insieme il miglior modo possibile. CryptUnprotectData restituisce una struttura DATA_BLOB costituito da una matrice di byte e una lunghezza di byte. Nel mio programma questo sarà un UTF-16 stringa Unicode. SecureString ha un costruttore che prende un char * e lunghezza params, quindi mi piacerebbe essere in grado di fare qualcosa di simile:

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

Questo funziona, tranne UTF-16 è di lunghezza variabile, quindi non so davvero cosa usare come argomento lunghezza. L'esempio precedente assume 2 caratteri byte (BMP), ma per altri piani potrebbe essere fino a 4 byte. Ho bisogno di sapere il numero di caratteri UTF-16 in array di byte. Qual è il modo migliore per farlo senza copiare i valori intorno a memoria (compromettendo così la sicurezza). Ho intenzione di azzeramento e liberando l'array di byte nel minor tempo possibile.

È stato utile?

Soluzione

La maggior parte delle offerte API di Windows con UTF-16 punti di codice per quanto ne sono a conoscenza - in altre parole, si trattano le coppie di surrogati come due punti di codice al posto di un singolo carattere. Dato che il costruttore per SecureString sta trattando con un puntatore a .NET System.Char valori (che sono UTF-16) Penso che lo snippet di codice hai va bene - il numero di elementi in pbData è metà della sua dimensione in byte.

Per esempio, se pbData contenuto (solo) una coppia di surrogati, cbData sarebbe 4 e si sarebbe ancora voglia di passare 2 come secondo argomento - perché questo è il numero di valori SecureString sei la costruzione del <=> da. Il fatto che è un non-BMP caratteri unicode è irrilevante per il numero di UTF-16 <=> Valori è rappresentata.

(E sì, il supporto per i dati non-BMP è un po 'di confusione, e ho il sospetto pochissime persone lo fanno bene ovunque. Sono sicuro che non. Per fortuna in molti luoghi che non ho bisogno di cui preoccuparsi ...)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top