您的位置:首页 > 编程语言 > ASP

两种加密技术共同构建安全的ASP.NET数据访问

2005-11-20 17:40 633 查看
关键词
ASP.NET 数据访问安全性 数据库连接字符串 加密解密 注册表存储概述目前大多数面向企业级的ASP.NET应用系统都不可避免的要访问数据库中的内容,然而进行交互的数据无论是数据库连接的信息还是提交表单中的内容都不可避免的要在网络上传播,从某个客户端到Web服务器再到数据库服务器,这样就有可能发生数据的泄漏甚至数据库被入侵。为了保障数据的安全性,尤其是Web服务器上数据库访问信息的安全性,.NET平台提供了一系列有效的保密措施。本文就针对ASP.NET访问SQL Server数据库时,使用.NET安全机制结合操作系统本身提供的支持,深入探讨如何使用DPAPI和3DES这两种加密技术保证Web服务器上数据库连结信息的安全。

1.数据访问安全性

一般而言,ASP.NET应用程序的安全程度受应用程序中的最薄弱环节制约,数据库连接信息安全性恰恰又极易成为这个薄弱环节,因为它直接关系到用户程序与数据库之间的信息交互,从而成为整个ASP.NET应用安全性的基础部分。
与数据访问直接相关的重要安全性问题主要有以下几个方面,图1显示了这几个方面所处的层次关系。
l 安全存储数据库连接字符串
l 使用正确的标识来访问数据库
l 保护通过网络传递的数据的安全l 对数据库调用方进行身份验证
l 向数据库调用方授权无论用户的应用程序使用 SQL 身份验证连接到 SQL Server,还是连接到需要显式登录凭据的非 Microsoft 数据库,安全的存储数据库连接字符串就显得尤其重要。因为在这些情况下,能够被数据库驱动程序也就是所谓的各种数据提供者(Data Provider)所识别的数据库连接字符串中通常包含明文形式的用户名和密码。如果Web服务器上的数据库连接字符串本身以明文的形式放置在不够安全的地方,那么某些恶意的用户会轻而易举的看到这些细节并直接发起对数据库的攻击,这样一来即使在网络通信的过程中使用包括SSL和IPSec在内的保密性措施也与事无补。类似于SSL和IPSec这样的安全技术只能保证数据在网络上传输过程中不被泄漏,但仍然无力保护好进行数据库连接时的根源所在,这就要求技术人员必须首先解决好Web服务器上数据库连接字符串的安全问题。一个比较可行的办法就是将DPAPI与3DES这两种加密技术结合起来对连接字符串进行加密,并将密文存储在操作系统的注册表中,同时保证解密的过程尽可能少的依赖于人为因素。

图1 数据库连接信息安全性问题

2.使用DPAPI与3DES加密技术

2.1 DPAPI简述
Windows 2000 和更高版本的操作系统都提供 Win32® 数据库保护 API (DPAPI) 来对数据进行加密和解密。DPAPI 是密码 API (Crypto API) 的一部分,它在 Crypt32.dll 中实施。它由两个方法构成:CryptProtectDataCryptUnprotectData
DPAPI 的特别之处在于它能够消除使用密码的应用程序所带来的密钥管理问题。虽然其他加密技术能确保数据安全,但用户必须采取额外的步骤来保证密钥的安全。另外,一旦用户忘记或丢失了加密密钥,自己也无法重新获得解密后的明文信息,会造成很大的麻烦。这样一来,解密的过程不可避免的受到人为因素的制约,反而从某种程度上降低了安全性。DPAPI 通过借用与 DPAPI 函数的调用代码关联的用户帐户的密码派生出加密时所需的密钥,也就是说DPAPI加密密钥与当前系统用户的账户是紧密相关的。因此,操作系统(而不是应用程序)会管理密钥。有关DPAPI的详细说明请参见参考文献4。2. 2 3DES加密简述
DES是数据加密标准(Data Encryption Standard)的缩写,最早在七十年代由IBM公司投入使用的。3DES即三重DES,它采用3级DES加密,所以更加安全并且对于目前的各种应用比较有效。DES是块密码系统,它针对固定长度的明文块通过使用密钥将其转换为等长的密文。在DES中,明文块的大小是64bits。密钥的长度也是64bits,只是其中8bits用于奇偶校验,这样真正有效的密钥长度其实只有56 bits。3DES使用了三级的DES加密,每一级都有一个独立的密钥,那么3DES的密钥长就为168bits。具体地,在使用3DES加密时,如果明文M被密钥k1进行加密,那么加密的结果再被密钥k2加密,进而再被k3加密并获得密文C = Ek3(Ek2(Ek1(M)))。解密时只不过是使用相同的密钥对密文块进行反变换,那么破解的难点其实就在于密钥;然而3DES的密钥恰恰比较长,因此目前仍然没有行之有效的破解方法,所以其加密安全性仍然是值得信赖的。有关3DES加密解密算法的详细说明请参见文献5、6。

2.3 将DPAPI和3DES技术结合起来加密连接字符串

DPAPI是与操作系统紧密相关的Win32 API函数,如何加密如何解密对于用户而言是透明的,用户只需调用接口而无需考虑内部如何实现。3DES可以说是一套比较成熟的加密算法,方法本身是公开的。.NET本身也提供了算法实现类TripleDESCryptoServiceProvider支持标准的3DES加密,只是密钥需要用户定制。要想破解3DES,就要先获取密钥。如果使用DPAPI加密了3DES的密钥,DPAPI本身的密钥交由系统来管理,无疑使3DES加密连接字符串的安全性更高,并且紧密地与操作系统本身甚至是系统用户账户本身结合在了一起省去了由用户自己管理加密和解密密钥的麻烦。显然,这样发挥了各方面的优点,所以应该是确保数据库连接字符串内容隐蔽的首选方式。另外,加密后的连接字符串应该存储在操作系统的注册表中,这样还能够提供更多的保密性,也更进一步的与系统本身结合在了一起,同时方便了密文的管理。如图2所示。 图2 两种加密技术协同工作及密文存储示意图

2.4 使用注册表项存储密文

编程人员可以在 Windows 注册表中使用自定义项来存储加密的连接字符串和3DES密钥。这些信息可以保存在 HKEY_LOCAL_MACHINE (HKLM) 或 HKEY_CURRENT_USER (HKCU) 注册表配置单元中。对于没有用户配置文件的进程标识(比如 ASPNET 帐户),这些信息必须存储在 HKLM 中,以便允许 ASP.NET 代码对其进行检索。 如果将加密的数据存储在HKEY_LOCAL_MACHINE (HKLM)中,则只有本机的用户进程可以访问到其中的内容,并取回数据,任何网络上的其它用户是没有权限访问这些数据的;如果将加密的数据存储在HKEY_CURRENT_USER (HKCU)中,则只有本机的当前用户进程可以访问其中的内容,任何其他用户都无权限获取加密的数据。一般而言,将加密的数据存储在HKEY_LOCAL_MACHINE (HKLM)中就可以满足要求。

2.5 .NET对加密算法提供的支持

加密算法的具体实现其实比较复杂,好在.NET平台的类库提供了对常用加密算法的支持。之中归属于对称密钥加密算法的实现类有:l DESCryptoServiceProvider
l RC2CryptoServiceProvider
l RijndaelManaged
l TripleDESCryptoServiceProvider
特别的,以“CryptoServiceProvider”结尾的类是使用加密服务提供程序 (CSP) 基础服务的包装类;而以“Managed”结尾的类则是在托管代码中实现的。微软的MSDN技术文档所提供的示意图(图3)显示了 .NET 框架中上述加密算法及相应实现类之间的继承等级。算法类型基类(例如,SymmetricAlgorithm)是抽象类。可以从抽象类型基类派生一组抽象算法类。算法实现类提供所选算法的具体实现;例如,DES、Triple-DES、Rijndael 和 RC2。

图3 .NET框架中对称密钥加密算法类的继承等级
利用.NET提供的加密算法实现类,用户可以轻松的编写自己的加密算法类库,这里就可以将DPAPI的实现类和3DES的实现类封装到一个用户加密类库中去,在实现DPAPI和3DES两种技术加密数据以及获取密文并进行解密时仅仅调用接口函数就可以了。3.实施过程加密和解密数据库连解字符串并将密文存储在系统注册表内的实施过程使用C#语言描述,首先建立一个C#类库DataProtection,其中有五个类:DataProtector.cs集成了DPAPI函数调用方法,对密钥进行加密和解密。EncryptTransformer.cs和Encryptor.cs两个类实现标准3DES加密算法,对连接字符串进行加密;DecryptTransformer.cs和Decryptor.cs两个类实现标准3DES解密算法,对密文进行解密。有关它们的详细创建信息请看参考文献4。用户可以建立一个Windows Forms项目,用它来模拟数据库连接字符串被加密和解密的过程。加密连接字符串的过程是这样的,先给出待加密的连接字符串明文文本和3DES密钥明文,注意密钥一定要大于等于16个字符,否则不能满足3DES加密的要求,然后调用DPAPI函数的加密方法对16位3DES密钥进行加密获得密钥的密文;再调用标准的TripleDES接口函数对整个连接字符串明文进行加密并获取解密时的初始向量,如图4。加密后的密钥,连接字符串和获得的初始化向量就可以通过系统注册表接口函数写入注册表中,在HKEY_LOCAL_MACHINE/SoftWare表目录下新建用户自定义注册表项,把加密信息作为键值写入。
相应的,在需要进行数据库连接时,从注册表中提取密文的信息,包括加密的密钥,初始化向量,加密后的连接字符串,然后调用DPAPI的解密函数对密文进行解密,获得原明文3DES密钥,再调用标准的TripleDES解密函数接口,利用初始化向量的信息和明文密钥的信息对数据库连接字符串密文进行解密。用户程序就可以使用解密后的明文信息访问数据库了。

图4加密连接字符串并获取初始化向量结束语
需要强调的是,在实际应用中应先在ASP.NET程序外加密密钥和数据库连接字符串并存入注册表项,然后在一个特定的ASP.NET页面的后台程序(当然是进行数据库访问请求的程序)代码中调用提取密文,解密密文等方法,从而顺利的连接到数据库。显然,本机以外的其他用户一般而言是访问不到注册表信息的,即使访问到并获得了密文,由于非本机用户而无法破解密钥,所以保证了极高的安全性。当然,在进行数据访问请求时尤其是第一次进行数据库连接时,要有一个复杂的解密过程,虽然由系统在后台完成但是肯定会降低初始化数据库连接的性能。所以应该采取相应的措施在安全性和高性能之间谋求折衷,需要采取哪些措施则是更加庞大和深入的工程,也需要更深一步的研究。参考文献
[1] David Sceppa ADO.NET技术内幕 ISBN 7-302-07203-5 清华大学出版社[2] John Kauffman,Brian Matsik ASP.NET数据库入门经典------C#编程篇 ISBN 7-302-06144-0 清华大学出版社[3] Paul Kimmel C#编程深度探索 ISBN 7-302-06349-4 清华大学出版社[4] Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communicationhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/secnetlpMSDN.asp[5] TRIPLE DATA ENCRYPTION ALGORITHMhttp://csrc.nist.gov/cryptval/des/fr990115.htm#sec12[6] Triple DES Validation Listhttp://csrc.nist.gov/cryptval/des/tripledesval.html[7] 田丽华 编码理论 ISBN 7-5606-1256-3 西安电子科技大学出版社
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: