保密信息硬编码有安全问题
解决方案
Microsoft patterns & practices的Mobile Client Software Factory中的Mobile Configuratuin与Mobile PassWord Authentication程序构建块
对称算法和非对称算法
生成“散列权标(hash token)”
实现良好安全机制的技术“深度防御(defense in depth)”,
涉及安全设计、程序开发和设备管理与配置等
边界安全----一些安全策略配置
1良好安全性的实现
1)执行安全审查
审查代码的信息:未验证的用户输入;
对Web服务器资源访问的弱用户验证与授权;
硬编码的用户名、密码和其他保密信息
可能被外界访问的未加密敏感数据;
不必要长时间在设备(内存或永久性存储体)中存储敏感数据
威胁模型分析(threat modeling)过程将安全审查过程分为6个步骤:
(1)确定解决方案中必须进行保护的重要信息
(2)建立整体架构
(3)细化第(2)步建立的架构,确定信赖边界(既安全需求发生变化的区域),并确定其间的数据流
(4)确定可能影响程序安全的威胁,时刻牢记攻击者的目标
(5)将这些威胁记入文档
(6)考虑攻击者攻破每道防线,危及程序安全的后果,对这些潜在威胁进行评估,并按级别高低进行排序。
书:The Security Development Lifecycle(Michael Howard和Steve Lipner合著,Microsoft Press,2006)
2)为何不能对保密信息进行硬编码
原因:由于Microsoft .NET Framework的编译器不会将代码编译成依赖系统架构的机器代码,而是编译成Microsoft中间语言(Microsoft Intermediate Language,MSIL),后者是一组与CPU无关的指令,可以轻松由实时(Just-In-Time,JIT)编译器翻译为本地代码。JIT编译器对MSIL编译进行了优化,但对于代码的保护与其意图的掩饰并没有起多大作用。
工具:Lutz Roeder的Reflector(www.aisto.com/roeder/dotnet)这样的工具,可以对任何.NET动态链接库(Dynamic-Link Libtrary,DLL)或可执行文件进行反编译,还原源代码(虽然这不会与原来编写的格式完全一致,但功能是等效的,正面用途可以对“基类库”的代码进行反编译,学习类库的编写)
托管代码易被发现,本地代码也易被发现,发现在字符串表(String Table),全局唯一标识(GUID)或二进制数据则通过“熵搜索(entropy search)”工具找到。
3)保密信息隐藏技术的优与劣
对保密信息硬编码,且将代码模糊化:Dotfuscator社区版本,缺点不会更改常量的值
将保密信息藏在其他代码块中 缺点严重
将其存储在注册表中 严重
将其加密并存住在注册表或配置文件中 缺点:加密算法都确定了
每次都向用户询问密码 例如第7章的SqlClient示例访问Microsoft SQL Server
用户输入密码----密钥----对存储的加密的信息解密,结合加密技术==形成安全解决方案基础
需要考虑的问题:多久询问一次用户密码
忘记密码,如何处理
是否强制用户定期进行再验证
不能把原始密码存储于内存中,使用密码尽快生成加密密钥或散列(hash),然后删除密码,并覆盖包含原始密码的内存区域
4)良好安全性的实现需要用户的输入
2.凭据与其他保密信息的安全存储
威胁:设备、公共网络、后端系统
安全需求:加密数据库中的数据
用户名和密码都要已加密方式存储在配置文件中
一套机制,安全存储解密用的密钥
每一个用户有特有的用户名和密码
实现:Microsoft patterns & practices小组的Mobile Software Factory(MCSF)Mobile Application Blocks(附带的源代码Mobile Authentication Application Block)
1)保护SQL Server CE数据库中的数据
设置SQL Server CE密码,它使用的是MD5散列算法及RC4加密算法
2)使用Microsoft patterns & practices应用程序构建块进行安全方案编程
MCSF包含10种不同的应用程序构建块,使用其中三种:
Mobile Configuration Block 用于读取程序配置文件
Mobile Authentication Block 包含用于验证用户名和密码的方法
Endpoint Catalog API,用于暴露配置文件中存储的URL和用户凭据
使用这些,必须分别添加到Mobile.Configuration,Mobile.Authentication和Mobile.EndpointCatalog程序集的引用,或将所有所需的程序块复制到自己的解决方案中。本章示例ApplicationBlocksSecure
(1)配置文件的定义
使用移动Authentication Block
(2)配置文件的加密
ConfigSectionEncrypt工具(Base64编码)
Rijndael对称加密算法----高级加密标准(Advanced Encryption Standard,AES):intelligrid.info/IntelliGrid_Architecture/New_Technologies/Tech_Confidentiality.htm
(3)用户特有加密密钥的创建
指派用户名和密码,根据此用户名和密码生成另一个加密密钥,来加密主密钥
“加密服务提供程序”(Cryptographic Service Provider,CSP)
Rijndael对称加密算法----加密密钥,初始向量(initialization vector,IV,种子)
用户名和加密的密钥存储在XML(Entensible Markup Language)文件中,
(4)用户身份验证权标的创建
提供AuthenticationToken类建立用户验证的过程,两种方式
创建一个散列权标(hash token),将其传到设备的验证模块
通过现有的散列权标,进行用户名和密码的验证
本章示例ApplicationBlocksSecure中桌面程序UserTokens
(5)用户的验证与设备上配置文件的解密
清单10.2
LoginForm类
AuthenticateUser方法
DecryptSettings方法
(6)密码更改与遗忘的处理:设置一个新的
3.数据加密
使用System.Security.Cryptography命名空间
1)使用AES对称算法的加密
示例程序Encryption
(1)根据文本字符串生成密钥
通过“平台调用服务(Platform Invocation Service,PInvoke)”调用本地函数Crypto API
Mobile Password Authentication Block源代码
(2)加密
调用RijndaelManaged.CreateEncryptor(key,iv)方法创建加密器(ICryptoTransform类型实例)
获得ICryptoTransform对象,连同输入流,传到CryptoStream对象的构造函数中
将明文(以byte数组的形式)写入CryptoStream中,通过加密器,写入输出流
(3)解密
按照IV的长度读取4个字节,获得IV,使用Rijndael.CreateDecryptor(key,iv)创建解密器(ICryptoTransform类型实例),将输入流和解密器(包含加密信息)传到CryptoStream的构造函数中,通过CryptoStreamMode.Read打开,通过CryptoStream读取已加密的信息,解密流,将明文写入输出缓冲
2)使用RSA非对称算法的加密
SSL(Secure Sockets Layer,访问https://的URL时的底层协议)
非对称(asymmetric)算法加密对称密钥
私钥(private key)----公钥(public key)
使用密钥对进行身份验证
(1)RSA密钥的生成
忘记密码解决方案:使用RSA密钥对
示例代码:DesktopKeyUnlocker桌面组件,EncryptionWithAdminUnclock项目
功能:生成密钥对,以XML文本的形式将公钥输出
使用私钥
Windows组件CSP(Cryptographic Service Provider)存储密钥
(2)私钥的保护
桌面系统:RSACryptoServiceProvider工具保护私钥
.NET Framework 2.0的System.Security.Cryptography.ProtectedData类,封装了本地API Data Protection API(DPAPI),提供保护私钥的方法
Windows Mobile设备:使用OpenNetCF Smart Device Framework中对ProtectedData的实现
(3)使用RSA公钥的加密
清单10.3
SavePassword方法创建一个RSACryptoServiceProvider实例,通过 ReadPublicKeyXML方法,导入已用公钥和模量进行设置的RSAParameters实例,然后调用RSACryptoServiceProvider.Encrypt方法进行加密,保存在文件中。
(4)使用RSA私钥的解密
DesktopKeyUnclocker程序:通过GetRSAKeyPair方法,从密钥存储区获取RSA密钥。
4.网络连接的保护
SSL是一个支持握手(handshaking)与加密的协议
Web服务器上有X.509服务器证书,包含一个数字签名和一个私钥-公钥对。
数字证书身份验证中心Certificate Authority CA(例如“VeriSign,GTE,Thawte公司)
Microsoft Internet信息服务(IIS):Microsoft TechNet中Microsoft Windows Server 2003"IIS 6.0 Documentation"查找
www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS
工具SSLChainSaver:帮助排除SSL的问题,创建XML,用于在设备上准备必要的证书。blogs.msdn.com/windowsmobile/archive/2006/08/11/sslchainsaver.aspx
1)安装在基于Windows Mobile的设备上的根证书(12个)
证书存储区:ROOT;CA;MY;Privileged Execution Trust Authorities与Unprivileged Execution Trust Authorities;SPC
2)使用自签名证书
Issuing Your Own Server Certificates:www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/f72bde43-2f6a-4424-a890-f25b6c41425f.mspx?mfr=true
会出现验证的问题:System.Net.ICertificatePlicy类
通过.cab文件安装证书:Step-by-Step Guide to Deploying Windows Mobile-based Devices with Microsoft Exchange Server 2003 SP2
www.microsoft.com/technet/solutionaccerators/mobile/deploy/msfp_d.mspx
5.用户输入的有效验证
Never trust user input
手工编写复杂正则表达式:Regular-Expressions www.regular-expressions.info/tutorial.html
6.边界安全:设备访问的防护
企业应用程序:远程管理解决方案
使用Exchange Server 2003 SP2与MSFP进行远程管理
Massagin and Security Feature Pack(消息安全功能包,MSFP)
AKU(Adaptation Kit Update)
远程擦除设备 http://{servername}/mobileadmin
7.应用程序的签名
Windows Mobile 5 Application Security:msdn.microsoft.com/smartclient/default.aspx
1)理解Windows Mobile的安全策略
特权(Privileged)、非特权(Unprivileged)与未签名(Unsigned)的应用程序
信任(Trusted)与普通(Normal)执行模式
单层(one-tier security policy)与双层安全策略
安全策略:24种键-值对,重要的4102、4122、4123、4097
安全配置
使用Security Manager PowerToy进行安全配置的查看与设置
从www.microsoft.com/downloads下载这个工具,用于远程配置,可以更改一个非锁定设备或仿真器的设置
2)基于Windows Mobile的设备配置
更改设置:创建一个.cab配置格式文件(.cpf),创建XML配置文件
MakeCab实用程序,在SDKTools中
需要RAPI激活“远程性能监视器”
microsoft mobile 移动应用开发宝典----读书笔记(10)
最新推荐文章于 2021-03-08 21:12:32 发布