如何使用Microsoft .NET保护应用程序和数据的安全
身份验证
l 使用Credential来唯一标明一个用户
l 可以使用Microsoft Windows的集成身份验证,使用用户登录Windows时的用户凭证
l 编写自己的用户身份验证的程序,应用程序来管理用户凭证。
l System.Security.IIdentity接口和System.Secutity.GenericIdentity类
l System.Security.Principal.WindowsIdentity.
GetCurrent().Name
Authorization
l 使用基于角色的安全
l 可以通过编程实现基于角色的授权
l 角色可以代表商业流程中的工作职责,例如:秘书、经理、管理员、总监等
l 用角色的方式来管理用户会更加简便
如何使用基于角色的安全
l PrincipalPermissionAttrivute和SecurityAction.Demand
[PrincipalPermission(SecurityAction.Demand,
Authenticated:=True,
Name:=Nothing, Role:=“Administrator”)]
Public Class AdminClass
…
l IPrincipal.isInRole()
lblBossMan.Visible = Context.User.IsInRole(“BossMan”)
tbToBeChangedOnlyByQueenBee.ReadOnly =! Context.User.IsInRole(“QueenBee”)
加密
l 加密将字节打乱
l 对称加密与非对称加密
n 对称加密适用一个相同的密钥进行加密/解密
n 非对称加密使用一个密钥对进行加密/解密,加密与解密的密钥是不同的(公钥/私钥对)
n 非对称加密算法更加安全
n 对称加密算法更加高效
l System.Security.Cryptography名称空间
l 如何进行密钥管理
Code Access Security
n 最低权限的策略
n Code Group——按照逻辑分类的代码组合
n Code Group可以按照多种方式划分URL,strong name,zone,etc
n Permission Sets——许可集,用来定义代码能够访问的资源:文件I/O,Isolated Storage独立存储,SQL客户端,等等。
n Link demands
强命名应用程序集
n 使用sn.exe工具来创建强命名公钥/私钥对,并存储在文件当中:
sn.exe –k Northwind.snk
n AssemblyKeyFileAttribute
<Assembly: AssemblyKeyFile( “c:/keys/Northwind.snk”)>
n 优势
n 可以被装载到GAC当中
n Side-by-side部署,支持多个版本的应用程序集
n 在编译时,.NET的客户端代码使用了强命名应用程序集,在运行时能够有效地防止装入“木马”应用程序集
Delayed Signing
n 私钥保密性,确保开发团队中的多个组建使用相同的强命名
n 只导出公钥
sn -p Northwind.snk NorthwindPublicOnly.snk
<Assembly: AssemblyKeyFile(“c:/keys/NorthwindPublicOnly.snk”)>
<Assemble: AssemblyDelaySign(True)>
n Sn -Vr <assemblyname>:关闭对只拥有公钥的强命名应用程序集进行验证
n Sn -R <assemblyname> <keyfilename>:在发布之前对应用程序集进行缓签名
Link Demands
n 连接请求发生在外部的代码对本应用程序集进行调用的时候
n System.Security.Permissions名称空间
n 例如:StrongNameIdentityPermission属性
n 从某个应用程序集中提取公钥标示(一个十六进制的字符序列)
sn -Tp NorthwindModel.dll//生成下面需要的PublicKey
n 例如:
StrongNameIdentityPermission( SecurityAction.LinkDemand, PublicKey:=“002400000…d
6
”
, Version:=“
1.0.0
.0”)
SQL注入
n SQL注入这种威胁发生在动态生成SQL查询语句的时候,动态生成的SQL语句可能会被篡改
例如:
string sql = “select * from users where UserID = ‘” +
UserID + “’ and password=‘” + Password + “’”
n 如果在上面的SQL语句中加入’OR 1 = 1 ’ 这个条件,users表中的所有数据将最为结果返回
n 所有使用动态SQL查询的应用程序都有可能受到这种威胁,为了防御这种攻击,去掉所有的动态SQL查询:
使用ADO.NET中的SqlParameters
安全设计目标
n 最小化攻击范围
n 分析具体的攻击并阻止它们:
n 拒绝服务攻击
n 基于文件或目录的攻击
n SQL注入
n 引诱攻击(Luring)
n 防患于未然,提早预知新的攻击
n 使用经过验证的安全技术:身份验证,给予角色的授权,HTTPS,加密