是否可以为安全字符串到字符串的转换创建显式或隐式运算符

本文关键字:字符串 创建 运算符 转换 安全 是否 | 更新日期: 2023-09-27 18:33:26

我对各种转换方法进行了一些研究,并得出了explicitimplicit operators的使用。

注意到System.Security.SecureString是一个sealed类(它不能继承(,是否可以编写一个能够在System.Security.SecureStringSystem.String之间执行转换的explicitimplicit operator(使用此处描述的方法(。

例如,我知道您必须在要转换的对象的(部分(类中编写operator。 因此,我认为最好的方法是继承类,并编写必要的operators

是否可以 a( 使用System.Security.SecureStringexplicitimplicit operator执行转换到System.String , b( 执行类对象sealed的类对象的转换?

如果没有,除了使用类方法之外,是否有其他方法可以执行转换?

请提供一个务实的答案,假设我是Microsoft产品的消费者。

是否可以为安全字符串到字符串的转换创建显式或隐式运算符

注意到System.Security.SecureString是一个密封类,是否可以编写一个显式或隐式运算符来执行System.Security.SecureStringSystem.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安全性的机会。