Hos*_*Rad 119
还有另一种方式来转换SecureString
和String
.
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)
这是链接
小智 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)
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)
小智 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)
这是一个便宜的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)
我只想向所有说“这不是”的人指出,SecureString
许多提出这个问题的人可能是在一个应用程序中,无论出于何种原因,无论是否合理,他们并不特别关心密码的临时副本作为可 GC 的字符串位于堆上,但它们必须使用仅接受SecureString
对象的 API 。所以,你有一个你不在乎的应用程序密码是否在堆上,也许它仅供内部使用,密码仅在那里,因为底层网络协议需要它,并且您发现存储密码的字符串不能用于例如设置远程PowerShell运行空间——但没有简单、直接的单线来创建SecureString
您需要的。这是一个小麻烦-但可能值得的,以确保真正的应用程序做需要SecureString
做不可试探作者使用System.String
或System.Char[]
中介机构。:-)
我会把它扔出去.为什么?
您不能只是将所有字符串更改为安全字符串,并且突然您的应用程序"安全".安全字符串旨在尽可能长时间地保持字符串加密,并且仅在非常短的时间内解密,在对其执行操作之后擦除内存.
在担心保护应用程序字符串之前,我会说你可能有一些设计级问题要处理.向我们提供有关您尝试做什么的更多信息,我们可以提供更好的帮助.
unsafe
{
fixed(char* psz = password)
return new SecureString(psz, password.Length);
}
Run Code Online (Sandbox Code Playgroud)
没有花哨的 linq,不是手动添加所有字符,只是简单明了:
var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
Run Code Online (Sandbox Code Playgroud)