这个代码可以简化成一行吗?请随意重新编写,只要确保secureString被正确初始化。
SecureString secureString = new SecureString ();
foreach (char c in "fizzbuzz".ToCharArray())
{
secureString.AppendChar (c);
}
这个代码可以简化成一行吗?请随意重新编写,只要确保secureString被正确初始化。
SecureString secureString = new SecureString ();
foreach (char c in "fizzbuzz".ToCharArray())
{
secureString.AppendChar (c);
}
只需使用NetworkCredential,它已经内置了转换逻辑。
SecureString ss = new NetworkCredential("", "fizzbuzz").SecurePassword;
正如其他人所指出的那样,所有这些技术都会剥夺SecureString的安全性益处,但在某些情况下(例如单元测试)可能是可以接受的。
更新:
如评论中所指出的,NetworkCredential也可以用于将SecureString转换回字符串。
string s = new NetworkCredential("", ss).Password;
NetworkCredential
可以使用明文密码或 SecureString
密码,但在前一种情况下只公开明文密码。) - CodeFox您可以使用Linq:
"fizzbuzz".ToCharArray().ToList().ForEach(p => secureString.AppendChar(p));
.ToList()
操作:Array.ForEach("fizzbuzz".ToCharArray(), secureString.AppendChar);
(注:该代码功能与原始代码相同,只是不需要使用 .ToList()
方法将字符数组转换为列表。) - Steve GuidiToCharArray
,Linq 会自动枚举为 char
数组。 - GregsecureString
。 - nagates"fizzbuzz".ForEach(secureString.AppendChar)
。 - jpaugh除了使用不安全的代码和 char*
外,没有(更好的)方法。
这里的重点并不是将 SecureString 的内容复制到/从普通字符串中。常量 "fizzbuzz"
是安全漏洞所在。
string
了吗?这是否会使我的保护尝试无效?我可以在将其从控件中检索并放入我的SecureString
后强制对string
进行垃圾回收吗? - crush用方法组替换Lambda表达式,对Sascha的答案进行轻微改进
"fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);
var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });
以下是.NET中的NetworkCredential类如何执行:
SecureString secureString;
fixed (char* chPtr = plainString)
secureString = new SecureString(chPtr, plainString.Length);
丑陋但可能是最有效的。
fixed
需要在 unsafe
块中使用,而这又需要编译器开启 /unsafe
开关。 - DonBoitnott由于 SecureString
使用了 IDispose
接口,您可以像这样实现。
SecureString secure = new SecureString();
foreach(var character in data.ToCharArray())
secure.AppendChar(character);
本质上,data
将会是一个参数。
如果您使用using
来帮助减轻资源压力,您需要注意作用域。但根据使用情况,这可能是一个有益的替代方案。
更新:
您实际上可以使用完整的方法签名:
public static SecureString ConvertStringToSecureString(this string data)
{
var secure = new SecureString();
foreach(var character in data.ToCharArray())
secure.AppendChar(character);
secure.MakeReadOnly();
return secure;
}
如果您想进行解密,则需要执行以下操作:
public static string ConvertSecureStringToString(this SecureString data)
{
var pointer = IntPtr.Zero;
try
{
pointer = Marshal.SecureStringToGlobalAllocUnicode(data);
return Marshal.PtrToStringUni(pointer);
}
finally
{
Marshal.ZeroFreeGlobalAllocUnicode(pointer);
}
}
因为这个原因,我们需要尽可能少的代码,因此不需要使用.ToList()
:
Array.ForEach("fizzbuzz".ToCharArray(), secureString.AppendChar);
SecureString
设为只读。 - Greg