分为两种,代码访问安全,基于角色的安全性。
代码访问安全。是代码告诉.net框架,自己(代码)正确执行,需要的权限,.net框架手动分配代码可执行操作方面的权限,代码可列出调用自己需要的权限集合。
基于角色的安全。是根据用户身份,决定是否可访问资源。如windows用户
实现加密。.net框架的CryptoStream类,可用于加密所有输入/输出(I/O)的流和后备存储模型。
下面具体看这3点。
- 使用代码访问安全
各种权限,已经在.net通过类定义了。如读写文件目录、windows事件目录等。
请求运行代码的最小权限。例如在代码中用特性指定SecurityAction.RequestMinimum包含FileOPermissionAttribute的ALL,用特性指定叫做声明性安全,使用Permission对象的实例指定叫做强制性安全,这种安全只在根据运行时才知道的信息(例如待打开文件的名称)分配权限时才有必要。
代码组。用一个条件,把不同的代码段分组。例如,all code、application directory。
权限集。权限的集合。例如,Nothing、everythiing。
设置权限。有两个工具用来设置权限,1是命令行的代码访问安全策略工具caspol.exe,2是微软管理控制台(microsoft management console)中的工具,在开始菜单-管理工具-Microsoft.Net Framwork Configuration Tool,这个用起来更方便,这里可增删权限集,改权限集中的权限,可增删代码组,设代码组,就是在这里选择一段代码,分配一个权限集。设置权限能从企业(enterprise)、计算机(machine)、用户(user)这3个级别设置,应用程序域只能在代码中设置,而且只能从上级缩小权限。代码属于同级别多个代码组时,取各代码组相加的权限。默认情况下,企业级和用户级都是允许一切,由计算机级控制权限。
查看分配给了代码哪些权限。即查看指定代码组的权限。因有4级权限,设置权限时,可设置查看到哪级权限为止,即每个代码组的levelfinal,例如在计算机的代码组设置了这个属性,就只查看企业级和计算机级,各级别都有的权限,代码才有,如果调用代码的代码没有对应权限,也不能执行。有工具查看权限,用向导,运行库安全策略-计算程序集。
请求运行代码的可选权限。可在代码中用特性设置。代码没有可选权限时,虽然会产生安全异常,但会继续执行。
请求权限集。上述都是请求单个权限,可使用permissionSetAttribute特性,请求.net的内置权限集。
拒绝权限。代码能告诉clr不想拥有的权限。可通过特性设置,与授予不同的是加了个参数UnRestricted=true。被授予对应权限时,将停止运行。
要求权限。当使用自定义权限时,代码可对调用自己的代码,要求调用代码有若干权限。也是通过特性设置。如果是内置权限,.net已默认要求了调用代码需要有对应权限。
- 使用基于角色的安全性
基于使用代码的windows用户,来分配权限,即根据当前使用代码的用户所在的windows用户组,判断执行哪些代码。开发了基于角色的,可用于开发独立于windows登录系统的自己的登录系统。
使用两个接口
IIdentity用WindowsIdentity对象实现,代表正在运行当前代码块的用户,可查看用户名和身份验证方法。
IPrincipal用windowsPrincipal对象实现,建立在WindowsIdentity对象上,代表正在运行当前代码用户的安全背景,包括用户的身份和所属的角色。windowsPrincipal对象告诉clr应该分配给代码哪些基于角色的权限。
验证当前用户所在用户组
windowsidentity wi = windowsidentity.getcurrent();
windowspricipal wp = new windowspricipal(wi);
if (wp.isinrole(windowsbuiltinrole.poweruser())//isinrole方法,windowsbuiltinrole.poweruser枚举
{
}
else
{
}
也可使用PricipalPermission类或PricipalPermissionAttribute特性查看,用特性时,如果符合特性说明的当前用户属于指定用户组,执行代码,否则,抛出一个安全性异常。可使用PricipalPermissionAttribute类的Name属性查看当前用户的登录名。
- 加密
加密方式
对称加密(私钥加密),拥有私钥,即可解密加密文件,为了增大猜测私钥的难度,私钥用各种对称算法生成。稍复杂的一种是解密时需要私钥和初始化向量(IV)。
非对称加密(公钥加密),有一对公钥和私钥,告知对方公钥,用来加密消息,自己持有私钥,用来解密消息。破解起来,比对称加密难得多,公钥和私钥用非对称算法生成。
处理数字签名(验证消息源),哈希值(验证消息是否已被非法修改)。这两种这里不介绍,在.net框架文件的”加密服务“有介绍。
对称加密和非对称加密的使用过程。使用非对称加密,要求在计算加密消息上花费比对称加密多得多的工作量,可以综合使用这两种加密方式,平衡安全性和计算量。具体过程是,A生成一对公钥和私钥,公布给B公钥;???;A用私钥解密B发来的对称密钥和IV,???
使用对称加密,加密一个文件
这个文件可以是待保存到的本地文件(加密后保存到filestream),或待通过网络传送的文件(加密后保存到networkstream)。.net框架使用基于流的方法加密,用CryptoStream对象管理加密。
using system.security.cryptography;
....
filestream fsout = file.create(@"本地目录和文件名");
tripleDESCryptoServiceProvider tdes = new tripleDESCryptoServiceProvider ();//创建一种加密算法提供者,并生成密钥
CryptoStream cs = new CryptoStream(fsOut, tdes.createEncryptor(),CryptoStreamMode.Write);//创建加密算法提供者对应的加密管理器,这个管理器是个流对象,同时指定这个加密流对象对应的,在加密后保存文件的流,设置为写入加密后的信息。
streamWriter sw = new streamWriter(cs);//格式化加密流的输出。
sw.write(".....");
sw.flush();
sw.close(();
filestream fsKey = ???//读取密钥。
//保存密钥到本地文件。
BinaryWriter bw = new BinaryWriter(fsKey );
bw.write(tdes.key);
bw.write(tdes.IV);
bw.flush();
bw.close();
...
解密一个经过对称加密的文件
同样使用CryptoStream对象。
...
filestream fsKey = file.read(@"本地目录和文件名");//读取密钥。
binaryReader br = new binaryReader(fsKey);//格式化输出读取的密钥
tripleDESCryptoServiceProvider tdes = new tripleDESCryptoServiceProvider ();//创建一种加密算法提供者
//改写密钥和初始常量成读取出来的。因创建时自动生成一个,所以说改写。
tdes.key = br.readBytes(24);
tdes.IV= br.readBytes(8);
filestream fsIn = file.openRead(@"本地目录和文件名");//读取被对称加密的文件
CryptoStream cs = new CryptoStream(fsIn, tdes.createEncryptor(),CryptoStreamMode.Read);//创建加密算法加密管理器,设置为解密fsIn,tdes中有对应的密钥和初始常量。
SrteamReader sr = new SrteamReader(cs);//用来格式化输出加密管理器解密的文件内容。
console.writeLine(sr.readToEnd());
sr.Close();
...
使用非对称加密
非对称加密一般用于处理小量数据而不是数据流,所以可以直接调用实现类的方法来执行加密和解密。对称加密一般用于处理数据流。
...
RSACryptoServiceProvider rsa = new RSACryptoServiceProcvider();
Byte[] testData = {待加密数据1,待加密数据2};
Byte[] encryptedData = rsa.Encrypt(testData , false) ;//使用非对称算法提供者的方法,加密数据。严格来说,使用了哪一种或哪几种算法加密,使用多种算法时的顺序,都是保密的,不然可以通过程序解密。
Byte[] decryptedData = rsa.Decrypt(testData.false);//使用非对称算法提供者的方法,解密数据。
...