Возможно ли создание явного или неявного оператора для преобразования SecureString в string?


Я провел некоторые исследования по различным методам преобразования и пришел к использованию explicit или implicit operators.

Отмечая, что System.Security.SecureString является классом sealed (он не может быть унаследован от), Можно ли написать explicit или implicit operator, который способен выполнять преобразование между System.Security.SecureString и System.String (используя методологию, описанную здесь ).

Например, я знаю, что Вы должны написать operator в (частичном) классе преобразуемого Объекта. Поэтому я решил, что лучший способ сделать это-наследовать класс и написать необходимый operators.

Можно ли а) выполнить преобразование с использованием explicit или implicit operator для System.Security.SecureString в System.String, б) выполнить преобразование объекта класса, который является классом sealed?

Если нет, существует ли другой метод, помимо использования метода класса, который будет выполнять преобразование?

Пожалуйста, дайте прагматичный ответ, предполагая, что я являюсь потребителем продуктов Microsoft.
2 2

2 ответа:

Как уже обсуждалось в другом месте, простой ответ на ваш первоначальный вопрос-нет, невозможно добавить оператор К SecureString, чтобы сделать что-либо, поскольку он запечатан.

Ответ на "(b) выполнить преобразование объекта класса, класс которого запечатан" является более сложным.

То, что вы можете сделать, это создать свой собственный struct, например, называемый EncryptedString, который имеет SecureString в качестве поля private. После этого вы можете добавить любое SecureString string операторы и методы преобразования и сравнения в это struct для удовлетворения ваших потребностей. Это, строго говоря, не выполняет преобразование объекта класса, вместо этого он создает новый type для удовлетворения ваших потребностей. Как говорится, "композиция над наследственностью" (см. http://en.wikipedia.org/wiki/Composition_over_inheritance ), так что на самом деле этот подход отвечает вашим потребностям и рассматривается как "лучшая практика".

Теперь об отказе от ответственности:

Весь смысл SecureString в том, что, в отличие от string, он безопасен. Если если вы начнете преобразовывать SecureString в string (или позволите SecureString быть созданным из string), вы подорвете весь смысл класса.

Поэтому, если вам нужно сделать сравнение, пожалуйста, используйте Marshal.SecureStringToBSTR() и Marshal.StringToBSTR(), чтобы преобразовать их в BSTR structures, сравнить их, стереть память и освободить ее, или какой-то аналогичный механизм, чтобы свести к минимуму шансы на угрозу безопасности SecureStrings.

Отмечая, что System.Security.SecureString является запечатанным классом, можно ли написать явный или неявный оператор, который способен выполнять преобразование между System.Security.SecureString и System.String?

Да, Если вы являетесь членом команды библиотеки базовых классов, вы можете это сделать. Конечно, это плохая идея.

Если вы не являетесь членом команды BCL, то нет. Вы должны иметь возможность изменять исходный код одного из двух классов.