将String转换为SecureString

Dev*_*404 101 .net c# security securestring

如何转换StringSecureString

Hos*_*Rad 119

还有另一种方式来转换SecureStringString.

1. String to SecureString

SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
Run Code Online (Sandbox Code Playgroud)

2. SecureString到String

string theString = new NetworkCredential("", theSecureString).Password;
Run Code Online (Sandbox Code Playgroud)

这是链接

  • 如果您的代码使用您想要保护的值创建`string`对象,则使用`SecureString`是没有意义的."SecureString"的目标是避免在托管内存中包含字符串,因此检查该内存的攻击者可以发现您要隐藏的值.由于您调用的`NetworkCredential`构造函数需要一个字符串,这不是可行的方法......当然,您的代码是一种简单的方法来转换为SecureString和从SecureString转换,但使用它会使您的代码像使用简单一样安全`string` (13认同)
  • @GianPaolo虽然理论上是正确的,但在实践中我们仍然需要在使用某些库时使用`SecureString`.在这里说实话,如果有人正在主动扫描你的应用程序的内存,那么你已经输了.即使您已经正确使用了SecureString,我也从未见过,但仍有其他有价值的数据需要提取. (13认同)
  • 这是迄今为止最常见用例的最佳解决方案! (5认同)

小智 116

你没有.使用SecureString对象的全部原因是为了避免创建一个字符串对象(它被加载到内存中并以明文形式保存在垃圾收集之前).但是,您可以通过附加添加到SecureString的字符.

var s = new SecureString();
s.AppendChar('d');
s.AppendChar('u');
s.AppendChar('m');
s.AppendChar('b');
s.AppendChar('p');
s.AppendChar('a');
s.AppendChar('s');
s.AppendChar('s');
s.AppendChar('w');
s.AppendChar('d');
Run Code Online (Sandbox Code Playgroud)

  • 别忘了把它做成只读s.MakeReadOnly(); (26认同)
  • "这个组合是'12345` ......这就是白痴在行李箱上的那种东西!" (13认同)
  • 我只看到了`*****` (7认同)
  • 这是一个la脚的论点。您在哪里获得密码?从表单或命令行。在他们创建直接从设备或命令行参数读取安全字符串的方法之前,我们需要将字符串转换为SecureString。 (4认同)
  • @DonaldAirey 您从机密管理员那里获得了密码。一般来说,我们在这里谈论的秘密不是用户密码,而是可能导致权限提升或数据泄漏的东西。这意味着密码用于其他服务,不应通过命令行或通过网络渠道以明文形式传递。 (2认同)

M20*_*012 52

下面的方法有助于将字符串转换为安全字符串

private SecureString ConvertToSecureString(string password)
{
    if (password == null)
        throw new ArgumentNullException("password");

    var securePassword = new SecureString();

    foreach (char c in password)
        securePassword.AppendChar(c);

    securePassword.MakeReadOnly();
    return securePassword;
}
Run Code Online (Sandbox Code Playgroud)

  • +1,但请注意,将密码作为字符串参数传递会在托管内存中创建未加密的字符串实例,并且首先会破坏"SecureString"的用途.只是指出未来的人来使用这段代码. (21认同)
  • @Cody这是真的,也是一个好点,但我们很多人并不关心SecureString是否安全,只是因为某些Microsoft API需要它作为参数. (17认同)
  • @Cody 事实证明,即使是 SecureString 类也无法对字符串进行加密。这就是为什么 MS 正在考虑废弃该类型 https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md。 (5认同)

小智 17

你可以这样说:

string password = "test";
SecureString sec_pass = new SecureString();
Array.ForEach(password.ToArray(), sec_pass.AppendChar);
sec_pass.MakeReadOnly();
Run Code Online (Sandbox Code Playgroud)


gra*_*der 8

这是一个便宜的linq技巧.

            SecureString sec = new SecureString();
            string pwd = "abc123"; /* Not Secure! */
            pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
            /* and now : seal the deal */
            sec.MakeReadOnly();
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是一个练习,可以看到一次可以生成多少个纯文本的临时副本 (28认同)
  • 在理想世界中是正确的。但有时你必须..有一根绳子。我可以将所有(分层)代码编码为 SecureString,但是当我(最终)进行需要客户端秘密(作为纯字符串)的休息调用时......那么这就是我要做的。我如何处理这个问题是..等到最后一刻将其变成字符串,使用它,然后(不是真正)销毁字符串本身,然后(尽我所能)销毁SecureString。这是尽量减少暴露的“最佳尝试”。是的,我了解 IL/内存“用法”。恕我直言:微软应该将此对象命名为“KindaSecureString”。 (2认同)

Jon*_*ert 8

我只想向所有说“这不是”的人指出,SecureString许多提出这个问题的人可能是在一个应用程序中,无论出于何种原因,无论是否合理,他们并不特别关心密码的临时副本作为可 GC 的字符串位于堆上,但它们必须使用接受SecureString对象的 API 。所以,你有一个你不在乎的应用程序密码是否在堆上,也许它仅供内部使用,密码仅在那里,因为底层网络协议需要它,并且您发现存储密码的字符串不能用于例如设置远程PowerShell运行空间——但没有简单、直接的单线来创建SecureString您需要的。这是一个小麻烦-但可能值得的,以确保真正的应用程序需要SecureString做不可试探作者使用System.StringSystem.Char[]中介机构。:-)


Spe*_*nce 7

我会把它扔出去.为什么?

您不能只是将所有字符串更改为安全字符串,并且突然您的应用程序"安全".安全字符串旨在尽可能长时间地保持字符串加密,并且仅在非常短的时间内解密,在对其执行操作之后擦除内存.

在担心保护应用程序字符串之前,我会说你可能有一些设计级问题要处理.向我们提供有关您尝试做什么的更多信息,我们可以提供更好的帮助.

  • 我的应用程序通过在安全系统上运行来保护.我不在乎这个在内存中加密的特定字符串.如果它受到损害,关于这个系统有更重要的信息要担心.我的程序需要使用的Microsoft API只需要SecureString.暗示开发人员考虑他或她自己的用例,并确定将字符串转换为SecureStrings是否是上下文中的有效操作. (4认同)
  • 我只是想用它来设置 ProcessStartInfo 的密码并以不同的用户身份运行我的 exe..这对我有用... (2认同)

hyp*_*rsw 6

unsafe 
{
    fixed(char* psz = password)
        return new SecureString(psz, password.Length);
}
Run Code Online (Sandbox Code Playgroud)


gar*_*arg 5

没有花哨的 linq,不是手动添加所有字符,只是简单明了:

var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
Run Code Online (Sandbox Code Playgroud)