VS C#编程中对配置信息的加密

时间:2022-05-02 08:33:08

VS C#编程中对配置信息的加密

摘要:对的WEB应用程序中配置信息加密的方法和步骤做了详细介绍和分析,而且还延伸应用了这种信息加密方法到Microsoft Visual Studio C# 数据库窗体程序上,同时也分析和探讨了其不足之处和可能的替代解决方法。

关键词:;配置信息加密;c#数据库连接字符串

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)33-7467-03

使用微软的Visual Studio C# 基于开发IIS网站, 通常都会有一个存储项目配置信息的文件web.config。另外,使用VS C#编写的带有数据库的本地窗体程序,通常也会有一个配置信息文件app.config。一般来说在这些.config配置文件中会包含一些敏感信息,比如数据库连接字符串(其中含有数据库连接用户名和密码明文),如图1所示配置文件中就有很明显的UserID=sa; Password=0 这样的明文,这就需要对其进行加密处理,以保证数据的安全性。

意识到这一点,微软的VS 中提供了一个加密工具aspnet_regiis,可以对 Web.config 文件中的任何配置节进行加密处理,可以通过运行工具aspnet_regiis来完成对配置文件的加密操作。

1 实现步骤

首先要准备好环境, 在WIN7上通过运行MicroSoft Visual Studio自带的命令行工具vcvarsall.bat,可以提供执行aspnet_regiis的环境(如图2所示)。

环境准备好之后,就可以利用这个aspnet_regiis工具对配置文件进行RSA不对称算法的加密和解密。其优点是一旦加密完成,对应用程序将是透明的,编程中无需显示介入,也就是说无需额外的代码来加密解密这些敏感信息,程序可以当他们是没有加密的一样直接使用。而且加密强度从RSA的角度来说也是足够强的。对程序员来说,不影响自己的代码编写,这似乎是一种完美的方案。下面介绍其详细实施步骤(以WIN7 MS Visual Studio 2010为例)。

1.1 配置文件Web.config的加密

1)声明容器

Web.config明文文件需要加上一个configProtectedData 节(section),从而对容器(Container)进行声明。添加之后配置文件如图3所示。

2)创建容器

执行命令行:aspnet_regiis -pc "ShihaoNetKeys" –exp就创建了一个名为 ShihaoNetKeys的容器,即生成了一个RSA密钥对,开关-exp 表示其私钥可以导出,导出的私钥可以供以后部署到其他服务器上解密使用。

3)加密配置文件

既然有了公钥私钥对,执行命令行:

aspnet_regiis -pef "要加密的section的名字" "到达web.config文件的绝对路径" -prov " section的name属性值" 就可以加密配置文件,

例如:

aspnet_regiis -pef "connectionStrings" "D: \WindowsFormsApplication4" -prov "ShihaoNetKeysProvider"

其中:

【connectionStrings】是要加密的section

【D:\WindowsFormsApplication4】是待加密文件web.config所在目录的绝对路径【ShihaoNetKeysProvider】的name属性

这些值可以对照加密前的web.config文件查看得到。

经以上三个步骤之后,得到的web.config配置文件就含有密文,无法直接读出敏感信息。从而达成了目的:对明文敏感信息的加密。而且程序的运行丝毫不受影响,对代码编写也是非侵入式的,没有任何额外的加密解密函数或者过程方法需要添加执行。在程序中可以直接调用数据库连接字符串连接数据库,无需显式的解密过程(如图4所示)。

这段直接载入加密连结字符串的代码在VS2010开发环境中运行通过。

1.2 C#数据库窗体程序App.config的加密

以上的加密做法也可以稍加改动应用到C#窗体程序中去,在窗体程序中app.config代替了web.config而存在,内容和目的也是几乎一致的。如果要对app.config中的敏感信息进行加密也可以如法炮制。 不过由于aspnet_regiis默认处理web.config文件, 所以需要对app.config进行重命名为web.config,加密之后再改名为app.config。 做法不再赘述。加密后的app.config(如图5所示)。

2 应用程序的部署

开发完毕,需要把代码部署到异地环境, 这时候也需要同步部署密钥容器。在本机可以来模拟异地部署,比如把密钥容器删除,执行命令:

aspnet_regiis -pz " ShihaoNetKeys"

删除后再运行程序,会提示出错:分析器错误信息: 未能使用提供程序“KeyProvider”进行解密。提供程序返回错误信息为: 打不开 RSA 密钥容器。

这说明,必须有容器才可以解密配置文件,也才能正常运行程序。所以异地部署必须拷贝容器。在任何一台未安装正确的密钥容器Key的机器上,程序都无法对connectionStrings节进行解密,因此也就无法正常运行。 所以需要从环境导出容器,再导入到部署的环境中。

容器导出命令:aspnet_regiis -px " ShihaoNetKeys " "u:\ ShihaoNetKeys.xml" –pri

(-pri开关表示private key, 导出私钥用于解密)

容器导入命令为:aspnet_regiis -pi " ShihaoNetKeys" "u:\ ShihaoNetKeys.xml"

部署之后的配置文件也是加密的,无法直接获取敏感信息。

3 分析和讨论

以上的加密方式实施之后带给我们几点思考:

1)应用部署起来不是很方便,虽然在编写代码上节省下时间,代码可读可维护性增强,但是会增加部署时的工作量。除了要携带私钥迁移容器,同时还需要赋予一些特别用户足够的权限来访问容器,否则也是无法解密配置文件的。比如需要给NETWORK SERVICE用户读权限,执行命令:

aspnet_regiis -pa " ShihaoNetKeys " "NT AUTHORITY\NETWORK SERVICE" ,可能需要重新启动iis。

2)虽然很多人热衷于在窗体程序中也使用这种加密方法,但是请清醒地注意到这种加密方法至始至终都没有设置过密码来保护RSA的私钥。可见其防护的脆弱性。对于

app.config进行加密实际意义并不大,因为无论如何,客户机都可以通过运行aspnet_regiis -pdf 来对配置文件进行解密,从而暴露敏感信息。

3)对于web.config进行加密的意义也仅限于,当web.config文件不小心泄露时,不会同时泄露敏感信息,如果恶意攻击者已经取

得了在服务器上运行程序的权限,那么同app.config一样,可以很容易通过通过运行aspnet_regiis -pdf 获取明文了。当然,通过aspnet_regiis -pa " ShihaoNetKeys " "NT AUTHORITY\NETWORK SERVICE"控制对不同用户对密钥容器的访问权限,应该还可以进一步获取一些安全性,比如可以控制某些用户即使登录到服务器上,也无法用aspnet_regiis -pdf对配置文件进行解密。

4 结论

1)对app.config的加密不推荐使用这种方式,虽然看似密文生成了,可以阻挡初级的普通用户。但是一些资深用户也可以用同样的工具aspnet_regiis进行解密,效果和程序利用容器的私钥解密一样。

2)对web.config此方法还是有一定意义的,唯一的不足就是部署的不方便,但是好处也是明显的,使得代码的编写和维护更加清晰简洁。可以结合自己的实际情况加以考虑。

3)对于app.config的替代解决方案可以是使用可逆的加密算法对敏感字符串加密,这样既方便又不会对代码有太多干扰,不失为一种比较好的替代方案。而且C#中有DES加密的系统调用System.Security.Cryptography,可以方便的获取加密服务。步骤描述如下:

加密步骤:通过DES加密算法输入明文数据库连接字符串,输出密文,将密文连接串写入app.config文件中,就完成加密工作。

解密步骤:在程序中可以动态载入app.config的DES加密连接字符串,如图6所示

完成载入之后,再在C#应用中对其使用DES解密算法,得到解密的数据库连接字符串即可顺利连接数据库。

参考文献:

[1] Microsoft Developer Network.加密和解密配置节[EB/OL]. http:///zh-cn/library/zhhddkxy(v=vs.100).aspx.

上一篇:课题开发研究的探讨 下一篇:远程接入技术SSL VPN 的应用