我试图了解.NET的SecureString的目的.来自MSDN:
System.String类的一个实例都是不可变的,当不再需要时,不能以编程方式安排垃圾收集; 也就是说,实例在创建后是只读的,并且无法预测实例何时从计算机内存中删除.因此,如果String对象包含敏感信息(如密码,信用卡号或个人数据),则使用该信息后可能会显示该信息,因为您的应用程序无法从计算机内存中删除该数据.
SecureString对象类似于String对象,因为它具有文本值.但是,SecureString对象的值会自动加密,可以修改,直到您的应用程序将其标记为只读,并且可以通过应用程序或.NET Framework垃圾收集器从计算机内存中删除.
初始化实例或修改值时,SecureString实例的值会自动加密.您的应用程序可以呈现实例不可变,并通过调用MakeReadOnly方法防止进一步修改.
自动加密是最大的收益吗?
为什么我不能说:
SecureString password = new SecureString("password");
Run Code Online (Sandbox Code Playgroud)
代替
SecureString pass = new SecureString();
foreach (char c in "password".ToCharArray())
pass.AppendChar(c);
Run Code Online (Sandbox Code Playgroud)
我错过了SecureString的哪个方面?
HttpClient
WebAPI客户端的生命周期应该是多少?为多个调用
设置一个实例是否更好HttpClient
?
创建和处理HttpClient
每个请求的开销是多少,如下面的示例所示(摘自http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from- a-net-client):
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:9000/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// New code:
HttpResponseMessage response = await client.GetAsync("api/products/1");
if (response.IsSuccessStatusCode)
{
Product product = await response.Content.ReadAsAsync<Product>();
Console.WriteLine("{0}\t${1}\t{2}", product.Name, product.Price, product.Category);
}
}
Run Code Online (Sandbox Code Playgroud) 用例是在 c# 中保护内存编程中的字符串。Microsoft 本身不鼓励使用 SecureString 类 ( https://docs.microsoft.com/en-us/dotnet/api/system.security.securestring?view=netframework-4.7.2 )。
我想知道它是否可以作为一个有效的替代方案:
有什么建议吗?