Мы используем сторонний COM API от NET. В настоящее время Visual Studio и, предположительно, TLBIMP используются для создания DLL-оболочки Interop.
Сгенерированный интерфейс одного конкретного метода, предоставляемого NET, не тот, который мы бы предпочли использовать. Можно ли изменить код взаимодействия COM, чтобы сигнатура метода, представленная в NET, была другой? Мы не можем изменить используемые интерфейсы COM или TLB, потому что это сторонний код.
Фактический пример выглядит следующим образом:
Метод, о котором идет речь, - это когда пароль передается открытым текстом. Текущий код выглядит следующим образом:
- Наша обработка пароля возвращает System.Security.SecureString (пароль зашифрован в памяти).
- Мы упорядочиваем SecureString в BSTR (досадный открытый текст, но впоследствии его можно обнулить для уменьшения воздействия).
- BSTR преобразуется в System.String (Ой! Это будет неизменным, потенциально никогда не сборщик мусора и сохранит пароль открытого текста в памяти).
- Функция стороннего интерфейса COM Interop переводит System.String и снова отправляет ее в BSTR.
- Сторонний COM-API берет BSTR и, надеюсь, обрабатывает его неопределенно безопасным способом.
Это шаги 2 и 3, которых я бы хотел избежать. Я не могу изменить тот факт, что сторонний API обрабатывает пароль в виде открытого текста, но я хотел бы, чтобы хотя бы код, который мы контролируем, сводил к минимуму присутствие открытого текста в памяти.
Я бы хотел изменить сигнатуру метода NET на использование SecureString вместо String - NET уже может маршалировать SecureString в BSTR, поэтому код взаимодействия COM может по-прежнему представлять те же данные фактическому COM API , но без ужасного шага создания строки. Можно ли это сделать?