C#学习笔记-隔离存储,序列化
罗朝辉()
《C#与.NET高级程序设计》读书笔记
隔离存储
1,由于.NET能加载来自不同位置来源的程序集,信任问题就很重要,我们要确保不同来源的程序集不会读取系统的敏感数据,进行不安全的操作。在.NET 平台上,是通过CAS(代码访问安全)的安全机制来处理信任问题的。使用CAS,CLR可以拒绝或授权许多可执行程序集的安全权限。包括:机器目录/文件结构的操作;网络/Web/数据库连接的操作;新建应用程序域/动态程序集;使用.NET反射服务;使用PInvoke进行非托管代码调用。
2,System.IO.IsolatedStorage命名空间中的类型可以使用隔离存储,向装有.NET的机器创建应用程序以读写数据到特殊位置。这可以理解为安全“沙盒”,在里面CLR会允许I/O操作,即使应用程序是从外部URL下载或从其他方式弄来的,都会由系统管理员放在安全的沙盒中。使用隔离存储我们可以在一定程度上持久化每一个用户的数据,以确保其他应用程序不能直接或间接破坏这些数据;此外,使用持久存储,我们的代码不需要在应用程序内硬编码路径或目录名,应用程序间接保存数据到一个独特的数据仓库中,它会和代码标识的一些方面进行关联,比如它的URL,强名或X509数字签名。
3,为了解决由下载或执行远程.NET程序集引起的安全问题,CLR会自动检测程序的标识并把它赋值给配置的代码组中的一个,简单来说,代码组是一组符号相同标识(比如来源)的程序集。CLR用来检测程序集属于哪个代码组的标准是指证据,除了来源,程序集也可以使用其他形式的证据放入代码组,比如程序集强名,X509签名数字标识或其他自定义标准。在评估了程序集证据以确定程序集属于哪个代码组之后,CLR就会查询和代码组关联的权限集来看程序集可以做什么,更重要的是不可以做什么。总的来说,代码组和它们关联的权限构成了安全策略,它被分成3个主要的级别(企业,机器以及用户),使用这种分层方法,系统管理员就可以在公司级别以及机器和用户的级别来创建唯一的策略。在所有安全策略(企业,机器和用户)被应用之后,程序集就会在.NET 运行库下执行,如果程序集尝试执行在其权限集之外的代码,CLR就会抛出运行时安全异常。
4,CLR首先从加载到内存中的程序集中读取证据,这个过程是自动的,当然我们也可以以编程方式读取证据或利用发射API和System.Security.Policy命名空间的Evidence来读取。CLR利用读取的证据把程序集放到代码组中,每一个代码组都被映射到一个具有默认安全设置集合(CLR用来判断程序可做什么或不可做什么)的安全区域,因此代码组就被授予一组权限并给予一个优化名称,如Full Trust,Internal等,每一个权限集是控制各种安全设置的单个配置权限的集合,因此程序集能进行的操作就被限定在这些权限内。
5,隔离存储的跟路径在用户目录下的<user>\App Data\Local\IsolatedStorage(Vista)或<user>\Local Settings\Application Data\IsolatedStorage中,放到隔离存储中的数据,和任何文件系统一样,可以被用户复制,移动或删除。隔离存储有一些不足,它不会对放到隔离存储中的数据进行自动加密,因此一些敏感数据需要手动加密。
序列化
6,使用对象序列化,我们可以持久化一个对象的状态到任何System.IO.Stream派生的类型中。我们可以使用[Serializable]特性类序列化类;如果某个域不需要被序列化,只需在这个域前加上[NonSerialized]特性,这样做可以减少持久化数据的大小。
7,使用BinaryFormatter持久化一个对象,会将它的所有需要序列化字段序列化;如果使用XmlSerializer或SoapFormatter类型的话,只有公共字段数据或拥有公共属性的私有数据可以被序列化。