在作具体的应用的时候,我们通常都会在config文件中保存一些重要的配置,比如帐号和密码,以及连接串。为了安全,我们需要将其加密后再写入配置文件,以免被居心叵测者非常容易地获取到。.Net Framework提供了几种对称加密算法,比如DES,3DES等,我们可以使用这些算法将敏感的配置项加密。然而,对称加密的天然问题就是密钥的管理——加密算法都是公开的,如果密钥泄漏(比如有人把密钥写在代码中,那完全可以通过反编译代码来得知密钥),那加密就形同虚设了。所以我们需要把密钥保存在相对安全的地方。
可行的做法为:
1、 使用Aspnet_setreg.exe 工具。此工具使用DPAPI来加密和解密数据,它可以把你需要保护的数据保存在注册表,它受DACL(discretionary access control list)保护,在配置文件中只需要指明注册表键的位置。有一篇How to讲解了如何使用此Aspnet_setreg.exe 工具。在我的随笔系统安全简述中对DPAPI有简单的讲述——DPAPI(Data Protection Application Programming Interface),一个保护密钥的对策。DPAPI使用用户的登录密码加密和解密数据。数据保护过程:(1)生成一个强健的Key,称为主钥,它受用户的密码保护;(2)使用基于口令的密钥生成过程由用户密码生成一个密钥;(3)这个由口令生成的密钥用来加密主钥,它被存储在由计算机上的活动目录生成的用户概述中。安全地存储登录证明,比如用户名和密码,在磁盘上,是安全应用地一个重要方面。DPAPI是一个系统提供的数据保护服务,是一个安全地存储用户证明的解决方案。
2、 直接使用DPAPI和.Net framework提供的加密算法。提供一个key(key越强就越安全),使用DPAPI加密,把它存储在注册表中,然后我们可以使用此key来加密和解密数据了——加密和解密算法我们可以选择.Net framework提供的3DES(DES比较脆弱)。最后,我们把加密过的配置项(如连接串)写入config文件即可。
使用DPAPI时,需要我们提供足够强健的key,否则安全性会降低。另外,如果侵入者获得了系统的管理员权限的话,那这些安全措施都将失效,因为管理员有权限读取我们存入注册表的key。
下面是使用DPAPI加密和解密数据的例子: