Возможно ли создание явного или неявного оператора для преобразования 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 ответа:
Как уже обсуждалось в другом месте, простой ответ на ваш первоначальный вопрос-нет, невозможно добавить оператор К 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, то нет. Вы должны иметь возможность изменять исходный код одного из двух классов.