如果我理解正确的话,这是为了防止纯文本进入内存,这样应用程序就不会受到对内存、垃圾堆或分页到磁盘的内存的神秘攻击.SecureString被送入非托管字节,一次消耗一个非托管字节,然后从内存中删除该字符串.(如果我走远了,请纠正我!)

在ASP.NET中,秘密被收集在Web表单中,该表单以HTTPS形式回发.但是,Request对象会将表单中的所有请求值转换为名称值对,并将它们放入一个集合中,例如Request["TxtPassword"]--因此,甚至在我可以获取字符串之前,它就已经被不安全地写入内存了.更糟糕的是,如果我使用的是控件,那么不安全的表示形式在TextBox的属性中将有更多的托管字符串.

要使用此SecureString执行任何操作,我需要一个接受非托管字符串的API--因此似乎不能将安全字符串用于存储的proc参数或其他更多内容.

我这样做是错误的还是愚蠢的try 使用SecureString,而不是将不安全字符串的副本泄漏到托管内存中?

切换到OAuth或Windows auth不是一个选项.

推荐答案

正如您正确推断的,以及其他人已经提到的,使用SecureString来存储来自ASP的安全敏感数据没有什么意义.NET格式,因为这些数据已经以纯文本形式存在于内存中.

然而,在其他情况下,建议使用SecureString,因为敏感数据是由程序本身创建的,在使用完之后不应保留在内存中.例如,以编程方式创建SharePoint网站,或将身份验证凭据从一个系统传输到另一个系统.

在过go 的好日子里,更容易确保敏感数据的生命周期尽可能短.它可以在堆栈上分配,并在程序使用完毕后立即清除:

char secret[512];
generate_secret(secret, sizeof(secret));
do_something_with(secret);
memset(secret, 0, sizeof(secret));
// Secret data is now gone.

但是,对于托管字符串,这种方法是不可能的,主要原因是:

  • 它们没有在堆栈上分配,
  • 它们是不可变的,所以不能被清除,
  • 它们不是一次性的,所以不能保证GC何时释放数据.它甚至可能永远不会被释放,这取决于内存条件.

SecureString试图通过可变和一次性的方式来解决这个问题,这允许一个人写:

using (SecureString secret = new SecureString()) {
    GenerateSecret(secret);
    secret.MakeReadOnly();
    DoSomethingWith(secret);
}
// Secret data is now gone.

Asp.net相关问答推荐

禁用托管优化并重新启动调试实际上在 Visual Studio 中更改了哪些设置?

在 appSettings 中存储字符串数组?

下载功能在 asp.net 的更新面板中不起作用

使用 jQuery.ajax() 时如何处理错误?

如何使图像的一部分成为可点击的链接

如何使用 javascript 调用 ASP.NET c# 方法

温莎城堡有什么缺点吗?

如何使用 asp.net 获取 html Select 的选定值

错误:无法在 Web 服务器上开始调试... ASP.NET 4.0

将通用列表绑定到转发器 - ASP.NET

ASP.NET Core 2.0 为同一端点结合了 Cookie 和承载授权

在 aspnetcore (netcoreapp1.0) 中替代 System.Web.Security.Membership.GeneratePassword

Html.RenderAction 和 Html.Action 的区别

在 Asp.Net Core 中动态更改连接字符串

ASP.NET 身份提供程序 SignInManager 不断返回失败

当文件上传超出 ASP.NET MVC 中允许的大小时显示自定义错误页面

如何将 GridView.DataSource 导出到数据表或数据集?

如何使用 int ID 列更改 ASP.net Identity 2.0 的表名?

您的下一个 ASP.NET 项目的 Select 是什么:Web 窗体还是 MVC?

您将如何将 ASP.Net MVC 嵌入到现有的网站项目中?