Tod*_*ith 47 c# security securestring
这可以简化为一个班轮吗?只要secureString被正确初始化,就可以完全重写它.
SecureString secureString = new SecureString ();
foreach (char c in "fizzbuzz".ToCharArray())
{
secureString.AppendChar (c);
}
Run Code Online (Sandbox Code Playgroud)
Kev*_*vin 47
只需使用NetworkCredential.它具有内置的转换逻辑.
SecureString ss = new NetworkCredential("", "fizzbuzz").SecurePassword;
Run Code Online (Sandbox Code Playgroud)
正如其他人所指出的那样,所有这些技术都剥夺了SecureString的安全优势,但在某些情况下(例如单元测试),这可能是可以接受的.
更新:
如评论中所述,NetworkCredential还可用于将SecureString转换回字符串.
string s = new NetworkCredential("", ss).Password;
Run Code Online (Sandbox Code Playgroud)
Sas*_*cha 46
你可以使用Linq:
"fizzbuzz".ToCharArray().ToList().ForEach(p => secureString.AppendChar(p));
Run Code Online (Sandbox Code Playgroud)
Hen*_*man 28
除了使用不安全的代码和a char*
,没有(更好)更好的方法.
这里的要点是不要将SecureString内容复制到普通字符串中.常量"fizzbuzz"
常量是这里的安全漏洞.
Pet*_*lly 16
Sascha用方法组替换lambda的答案略有改进
"fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);
Run Code Online (Sandbox Code Playgroud)
Kev*_*vin 14
var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });
Run Code Online (Sandbox Code Playgroud)
以下是来自.NET的NetworkCredential类如何执行此操作:
SecureString secureString;
fixed (char* chPtr = plainString)
secureString = new SecureString(chPtr, plainString.Length);
Run Code Online (Sandbox Code Playgroud)
丑陋但可能效率最高.
由于SecureString
利用了IDispose
界面。您实际上可以这样做。
SecureString secure = new SecureString();
foreach(var character in data.ToCharArray())
secure.AppendChar(character);
Run Code Online (Sandbox Code Playgroud)
本质上,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;
}
Run Code Online (Sandbox Code Playgroud)
对于解密,您需要执行以下操作:
public static string ConvertSecureStringToString(this SecureString data)
{
var pointer = IntPtr.Zero;
try
{
pointer = Marshal.SecureStringToGlobalAllocUnicode(data);
return Marshal.PtrToStringUni(pointer);
}
finally
{
Marshal.ZeroFreeGlobalAllocUnicode(pointer);
}
}
Run Code Online (Sandbox Code Playgroud)
以下文章还将为您提供一些其他信息。
最少的代码,因为.ToList()
这不需要:
Array.ForEach("fizzbuzz".ToCharArray(), secureString.AppendChar);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
46765 次 |
最近记录: |