如果我理解正确的话,这是为了防止纯文本进入内存,这样应用程序就不会受到对内存、垃圾堆或分页到磁盘的内存的神秘攻击.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相关问答推荐

self 跟踪实体与 POCO 实体

业务线应用程序:F# 会让我的生活变得轻松吗?

MSCharts找不到请求类型'GET'的http处理程序错误

如何通过 Asp.net 中的命令参数传递多个值?

Anti-Forgery Token 适用于不同的基于声明的用户

使用 jQuery 验证插件匹配两个字段

如何在 FileUpload 控件中限制文件类型

无法让嵌套在 UpdatePanel 中的 WebControl 中的 ScriptManager.RegisterStartupScript 工作

IIS 6.0 通配符映射基准?

在 IIS 上托管 ASP.NET 5 项目

测试 Web 表单应用程序 (ASP.NET) 的最佳方法是什么

这个rendersection的代码是什么意思?

由 UpdatePanel 内 GridView 内的 LinkBut​​ton 触发的完整回发

不同域的登录页面

如何获取程序集的最后修改日期?

Asp.Net web 服务:我想返回错误 403 禁止

在 Application_BeginRequest 中设置会话变量

使 WCF Web 服务与 GET 请求一起工作

如何直接在 .aspx 页面中访问 web.config 设置?

ASP.NET 网格视图与列表视图