C# Oracle数据库和SecureString

C# Oracle数据库和SecureString,c#,oracle,oracle10g,securestring,C#,Oracle,Oracle10g,Securestring,我当前正在将用户密码存储在SecureString中。在与DB的连接重置时,也会保留该选项 我的问题是,我试图将此密码传递给OracleParameter,但我不确定它是否支持此密码 Oracle的Oracle.DataAccessdll是否支持SecureString或BStr?因为如果我必须将其转换为字符串,那么这将有点违背SecureString的目的 ---编辑 我知道SecureString是通过尽可能少地保留未加密的密码副本来减少攻击面。问题是在某个时候,你当然必须解密密码才能使用它

我当前正在将用户密码存储在
SecureString
中。在与DB的连接重置时,也会保留该选项

我的问题是,我试图将此密码传递给
OracleParameter
,但我不确定它是否支持此密码

Oracle的
Oracle.DataAccess
dll是否支持
SecureString
BStr
?因为如果我必须将其转换为字符串,那么这将有点违背
SecureString
的目的

---编辑

我知道
SecureString
是通过尽可能少地保留未加密的密码副本来减少攻击面。问题是在某个时候,你当然必须解密密码才能使用它。如果我可以在
OracleParameter
中传递
char[]
BStr
或安全字符串本身,那么我可以在调用返回后清除它。但如果我必须创建一个字符串才能将其传递给Oracle,那么我刚刚创建了一个新的不可变密码副本。所以我不确定我当时得到了多少。

是你私人信息的内存持有者

实现它的原因是,如果使用simple
string
保存用户私有信息,即使在不再引用该对象且该对象已被垃圾收集后,黑客代码通过执行进程内存转储仍可能访问该内存位置中的可用数据,因此,访问私人信息

SecureString
的情况下,该位置将被擦除,因此即使在内存转储中,您也不会看到与代码中使用的字符串相关的任何内容


正如Yahia所建议的,如果您担心连接安全或数据传输安全,请为此使用安全连接。

否-AFAIK不支持您所要求的

但是,即使支持它,安全问题仍然存在,因为使用的Oracle驱动程序(OCI)是本机的,并且不知道有关
SecureString
的任何信息,因此它将在不加密的情况下在内部处理该值,这反过来意味着该值可能最终在交换文件中未加密

如果你所要求的东西在.NET方面得到支持,那会更安全一点,但仅仅是这样


如果您真的需要这种级别的安全性,我建议您重新设计软件的该部分,以使用加密值,使服务器端(Oracle DB)的内容不需要“纯文本”,而是使用加密值……

SecureString是一个“内存”概念。。。ADO.NET与此无关。。。如果您担心“在线”的安全性,那么请使用加密连接和/或基于证书的方法…我不关心“在线”的安全性,这不是问题的目的。我将把这个问题附加到clarifyok。。。现在更清楚了。。。请看下面我的答案……这根本不是关于连接安全的。我很清楚这是一个不同的主题。我指的是内存安全性。我知道SecureString旨在减少攻击面。但是,如果我必须将SecureString转换为字符串以连接到Oracle,那么我只需将明文密码作为字符串公开。我再也不能控制什么时候是垃圾了collected@Phyx:好吧,如果您关心内存中的安全性,那么使用SecureString您已经处于一个很好的状态。@Phyx:我可能不了解您真正关心的问题。问题是,当您将SecureString转换为字符串时,您失去了保护的任何好处。因此,代码变得不受保护。希望这能帮上忙。差不多了。我知道这一点。我实际上是在问,在建立连接时,是否有办法防止将其转换为不可变的.NET字符串值。不幸的是,Oracle API似乎不支持这一点:(@Phyx:我不确定,但我认为它使用COM与之交互,但SecureString(根据MSDN)“SecureString类及其成员对COM不可见”。因此(我担心这一点。我真的不需要这种级别的安全性,但我想正是因为Oracle驱动程序是本机的,所以它可能会使用(w_u)char*作为字符串。如果它将非托管字符串作为输入,我仍然可以设置为零。但遗憾的是,几乎没有API支持SecureString。不过,感谢您的确认。