是否可以为安全字符串到字符串的转换创建显式或隐式运算符
本文关键字:字符串 创建 运算符 转换 安全 是否 | 更新日期: 2023-09-27 18:33:26
我对各种转换方法进行了一些研究,并得出了explicit
或implicit operators
的使用。
注意到System.Security.SecureString
是一个sealed
类(它不能继承(,是否可以编写一个能够在System.Security.SecureString
和System.String
之间执行转换的explicit
或implicit operator
(使用此处描述的方法(。
例如,我知道您必须在要转换的对象的(部分(类中编写operator
。 因此,我认为最好的方法是继承类,并编写必要的operators
。
是否可以 a( 使用System.Security.SecureString
的explicit
或implicit operator
执行转换到System.String
, b( 执行类对象sealed
的类对象的转换?
如果没有,除了使用类方法之外,是否有其他方法可以执行转换?
请提供一个务实的答案,假设我是Microsoft产品的消费者。
注意到
System.Security.SecureString
是一个密封类,是否可以编写一个显式或隐式运算符来执行System.Security.SecureString
和System.String
之间的转换?
是的,如果您是基类库团队的成员,则可以这样做。当然,这样做是个坏主意。
如果您不是BCL团队的成员,则不是。您需要能够更改两个类之一的源代码。
正如在其他地方所讨论的那样,您原始问题的简单答案是否定的,不可能将运算符添加到 SecureString 中以执行任何操作,因为它是密封的。
"(b( 对类被密封的类对象执行转换"的答案更为复杂。
您可以做的是创建自己的struct
,例如称为EncryptedString,它具有SecureString
作为private
字段。然后,您可以自由地向该struct
添加任何SecureString
<> string
转换和比较运算符和方法,以满足您的需求。严格来说,这不是执行类对象的转换,而是编写一个新type
以满足您的需求。俗话说"组合胜于继承"(见 http://en.wikipedia.org/wiki/Composition_over_inheritance(,所以实际上这种方法既满足了您的需求,又被视为OO"最佳实践"。
现在免责声明:
SecureString
的全部意义在于,与string
不同,它是安全的。如果您开始将SecureString
转换为string
(或允许从string
创建SecureString
(,则会破坏该类的全部意义。
因此,如果您需要进行比较,请使用Marshal.SecureStringToBSTR()
和Marshal.StringToBSTR()
将两者转换为BSTR structures
,比较它们,擦除内存并释放它,或一些类似的机制,以最大程度地减少危害SecureStrings
安全性的机会。