Создать SecureString из неуправляемой строки Unicode - PullRequest
4 голосов
/ 05 февраля 2009

Я хочу попытаться связать вместе функцию API окон CryptUnprotectData и .net SecureString вместе наилучшим образом. CryptUnprotectData возвращает структуру DATA_BLOB, состоящую из массива байтов и длины байта. В моей программе это будет строка Unicode UTF-16. SecureString имеет конструктор, который принимает параметры char * и length, поэтому я хотел бы иметь возможность сделать что-то вроде:

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

Это работает, за исключением того, что UTF-16 имеет переменную длину, поэтому я не знаю, что использовать в качестве аргумента длины. В приведенном выше примере предполагается 2-байтовые символы (BMP), но для других плоскостей это может быть до 4 байтов. Мне нужно знать количество символов UTF-16 в байтовом массиве. Каков наилучший способ сделать это без копирования значений в памяти (тем самым ставя под угрозу безопасность). Я планирую обнулить и освободить массив байтов как можно быстрее.

1 Ответ

2 голосов
/ 05 февраля 2009

Насколько я знаю, большая часть Windows API имеет дело с кодовыми точками UTF-16 - другими словами, вы рассматриваете суррогатные пары как две кодовые точки вместо одного символа. Учитывая, что конструктор для SecureString имеет дело с указателем на значения .NET System.Char (которые являются UTF-16), я думаю, что у вас есть хороший фрагмент кода - количество элементов в pbData равно половина его размера в байтах.

Например, если pbData содержит (только) суррогатную пару, cbData будет 4, и вы все равно захотите передать 2 в качестве второго аргумента - потому что это число System.Char значений, которые вы построение SecureString из. Тот факт, что это один не-BMP символ Unicode, не имеет отношения к числу значений UTF-16 System.Char, в которых он представлен.

(И да, поддержка данных, не относящихся к BMP, немного беспорядочная, и я подозреваю, что очень немногие понимают ее везде. Я уверен, что нет. К счастью, во многих местах вам не нужно волноваться ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...