当前位置: 首页 > news >正文

使用 .NET 2.0 SecureString 类保护敏感数据

导读:


本文转自
http://tech.it168.com/KnowledgeBase/Articles/a/e/b/aebce9476c230e342c4c171dcc5fb5b7.htm



【IT168知识库】
 


什么时候应当使用SecureString类


你可能感到怀疑,既然可以使用基本的String类,为什么还有必要使用SecureString类呢?问题在于String类的设计方面。例如,如果你有一个String类的实例包含某个人的社会安全号,你就希望应用程序在处理过程中将其安全保存,以避免泄露。


?


问题的关键在于安全保存文本,因为String类将其以明文形式保存。查明数据的保存位置需要对.NET字符串有一定了解。.NET字符串是不可变的。也就是说,字符串值的每一个变化都在内存中建立一个新的字符串。因此,内存中的各种敏感数据可能会被不严格的代码或用户访问。


?


这并不是说明为什么使用StringBuilder对象的最有效方法和解释。由于垃圾收集功能,你可能认为这并不是一个太大的问题,但利用.NET垃圾收集使用字符串恢复内存没有确定性。因此,如果数据确实十分敏感,你应当避免String类,而选择SecureString类这些其它方法。


SecureString类具有以下特性:


?




  • 它对保存在内存中的字符串值进行加密。它利用 数据保护API(DPAPI),因此它只能在基于NT的平台上使用。


  • SecureString类遵循IDisposable模式。


  • 加密文本不能被轻易解密;也就是说,不存在可以迅速阅读字符串内容的ToString类(没人说过加密很容易)。

一个简单的事例:


System.Security.SecureString ss = new System.Security.SecureString();


ss.AppendChar('T');


ss.AppendChar('e');


ss.AppendChar('c');


ss.AppendChar('h');


ss.AppendChar('R');


ss.AppendChar('e');


ss.AppendChar('p');


ss.AppendChar('u');


ss.AppendChar('b');


ss.AppendChar('l');


ss.AppendChar('i');


ss.AppendChar('c');


ss.AppendChar('.');


ss.AppendChar('c');


ss.AppendChar('o');


ss.AppendChar('m');


Console.WriteLine(ss);


增加最后一个字符后,以上代码用MakeReadOnly方法锁定字符串值。这意味着这个值不能被修改。使数据只读后,一旦你企图修改数据,就会出现异常。你会注意到,在执行时,代码只显示类的名称(System.Security.SecureString)。


?


获得数据


?


像.NET Framework的大多数对象一样,SecureString类也提供一个ToString方法。但是,ToString方法源于基本的System.Object类,在SecureString类中它不能被忽略。因此,调用SecureString类的ToString方法只显示对象(System.Security.SecureString)的类型,而没有实际的值。


?


应用SecureString类的难点在于如何恢复保存在其中的数据。因为它使用Windows的加密服务,要利用它,你需要使用System.Runtime命名空间。下面的C#代码是恢复数据的第一个步骤。它将SecureString类的内容复制到一个长指针对象中。


?


IntPtr pointerName = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(SecureString object);


?


????植入指针对象后,指针通过System.Runtime.InteropServices.Marshal类转换为一个字符串。这一操作由以下C#代码完成:


?


Console.WriteLine(System.Runtime.InteropServices.Marshal.PtrToStringBSTR(bstr));


?


微软文件指出,转换对象到一个指针分配了一个字符串所需的未管理内存,因此任务完成后你应当总是通过调用ZeroFreeBSTR方法释放指针对象,如以下的C#所示:


?


????System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(bstr);


?


下面的C#代码将在SecureString对象中保存数据与恢复数据、保存和显示内容的例子结合起来:


?


System.Security.SecureString ss = new System.Security.SecureString();


ss.AppendChar('T');


ss.AppendChar('e');


ss.AppendChar('c');


ss.AppendChar('h');


ss.AppendChar('R');


ss.AppendChar('e');


ss.AppendChar('p');


ss.AppendChar('u');


ss.AppendChar('b');


ss.AppendChar('l');


ss.AppendChar('i');


ss.AppendChar('c');


ss.AppendChar('.');


ss.AppendChar('c');


ss.AppendChar('o');


ss.AppendChar('m');


Console.WriteLine(ss);


?


IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(ss);


try


{


Console.WriteLine(System.Runtime.InteropServices.Marshal.PtrToStringBSTR(ptr));


}


finally


{


System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(ptr);


}


相关文章:

  • PowerShell的CmdLet开发的HelloWorld
  • Windows PowerShell学习笔记之一——命令帮助
  • C#的String.Format格式化举例(转)
  • .net(C#)中String.Format如何使用
  • ASP.net中名称以无效字符开头问题解决?
  • log4net简易配置--
  • c开发 一个关于访问性的问题
  • FCKedit(asp.net)详细配置以及下载
  • 如何生成一个新的GUID 全球统一唯一编号
  • readonly vs. const [C#] .net
  • VS2005 常用快捷键
  • ASP.NET中IsPostBack属性
  • 模仿Gmail右上角的Loading
  • 什么是数字信封?
  • - 转 Ext2.0 form使用实例
  • 【个人向】《HTTP图解》阅后小结
  • emacs初体验
  • EOS是什么
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java小白进阶笔记(3)-初级面向对象
  • Mocha测试初探
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • php面试题 汇集2
  • Spring声明式事务管理之一:五大属性分析
  • spring学习第二天
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 工作手记之html2canvas使用概述
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 浅谈Golang中select的用法
  • 说说动画卡顿的解决方案
  • 赢得Docker挑战最佳实践
  • 再次简单明了总结flex布局,一看就懂...
  • 转载:[译] 内容加速黑科技趣谈
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​iOS安全加固方法及实现
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $().each和$.each的区别
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (算法)Game
  • (推荐)叮当——中文语音对话机器人
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)UDP基本编程步骤
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)jdk与jre的区别
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core WebAPI中封装Swagger配置