【问题标题】:How to check if SecureString contains certain text?如何检查 SecureString 是否包含某些文本?
【发布时间】:2018-06-17 09:29:15
【问题描述】:

我正在尝试查看我的SecureString 是否包含特定文本。

我可以这样做:

var sstr = new SecureString();
...
//sstr is now appended with a set of characters
if(sstr.ToString().Contains("Hello world")) {
   //do something
}

这行得通,但是当我做sstr.ToString()的那一刻,似乎我只是将SecureString中的内容写入内存,这完全违背了使用SecureString的目的。

我应该如何检查SecureString 是否包含一些文本?

【问题讨论】:

  • 简短回答:你不知道。检查的原因是什么?
  • 唯一安全的方法是在循环中调用RemoveAt,这会消耗字符串,并且启动效率极低。在字符串变得安全之前进行此类检查,而不是之后。请注意,将SecureString 转换为字符串不会完全 破坏目的(它必须在某个时候发生),但确保字符串不被复制并在之后安全地擦除它并非易事。
  • @CamiloTerevinto 好吧,我正在读取以静默模式运行控制台 exe 的进程的输出。我将输出附加到 SecureString 中。有时,如果出现错误,该过程的输出可能会显示解密的密码。这就是控制台 exe 的工作方式,我无法更改。所以我希望我至少可以确保我从 Process 读取的输出不会留在我的应用程序的内存中。
  • 您是如何将其写入 SecureString 的?根据你的写作方式,它可能已经没用了
  • Dispose 会将其内部缓冲区清零。当然它不能跟踪你用 ToString 方法得到的字符串。

标签: c# .net string securestring


【解决方案1】:

在不破坏SecureString 目的的情况下检查它的最佳方法是在进程输出缓冲区循环中,在它进入SecureString 安全缓冲区之前。但在最好的情况下,这样做会创建一个包含最后 N 个字符的普通内存字符串(N 是“Hello world”长度),这有点不安全。当然,比调用 SecureString.ToString() 更不安全,因为正如你已经说过的,它会将所有文本存储在普通内存中,从而破坏目的。

【讨论】:

    猜你喜欢
    • 2012-11-08
    • 2015-01-31
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多