ASP.NET~~[ Web.config文件加密]~Fortify扫描 Password Management: Password in Configuration File

ASP.NET Web.config文件加密

在进行Fortify扫描过程中,出现了高危漏洞(Password Management: Password in Configuration File),即需要对config文件中的明文密码进行加密.

最开始我才用DES加密,在每一次从config文件中获取配置信息之前进行解密,但是由于不知道这个系统在多少个地方获取了配置文件,以及具体位置所以只能中断这个解决方案.

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace OMO.Infrastructure.Data.Common
{
    public class DESUtils
    {
        #region DES加解密
        //公钥获得
        public static DESCryptoServiceProvider getDes(string pubKey)
        {
            string AlternateKey = "CSu#中广核¥PcIt";// "CSu#中广核¥PcIt";
            pubKey = pubKey ?? "";
            int len = pubKey.Length;
            string key = len >= 8 ? pubKey.Substring(0, 8) : pubKey + AlternateKey.Substring(0, 8 - len);//长于8?取左边:再补左边的
            string iv = len >= 8 ? pubKey.Replace(pubKey.Substring(0, len - 8), "") : AlternateKey.Substring(AlternateKey.Length - 8 + len, 8 - len) + pubKey;//长于8?取右边:右边几位补左边
            var des = new DESCryptoServiceProvider();
            des.Key = Encoding.ASCII.GetBytes(key);
            des.IV = Encoding.ASCII.GetBytes(iv);
            return des;
        }
        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="pubKey"></param>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string DesEncrypt(string input, string pubKey = "")
        {
            var des = getDes(pubKey);
            var bytes = Encoding.UTF8.GetBytes(input);
            using (var ms = new MemoryStream())
            {
                using (var cryptoStream = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cryptoStream.Write(bytes, 0, bytes.Length);
                    cryptoStream.FlushFinalBlock();
                }
                var data = ms.ToArray();
                return Convert.ToBase64String(data);
            }
        }
        /// <summary>
        /// DES解密
        /// </summary>
        /// <param name="pubKey"></param>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string DesDecrypt(string input, string pubKey = "")
        {
            var des = getDes(pubKey);
            var bytes = Convert.FromBase64String(input);
            using (var ms = new MemoryStream())
            {
                using (var cryptoStream = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cryptoStream.Write(bytes, 0, bytes.Length);
                    cryptoStream.FlushFinalBlock();
                }
                var data = ms.ToArray();
                return Encoding.UTF8.GetString(data);
            }
        }
        # endregion
        //替换加密的密码为未加密之前的
        public static String GetConnection()
        {
            string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            var index1 = connectString.IndexOf("Password=");
            string string1 = connectString.Substring(index1);
            var index2 = string1.IndexOf("=");
            string string2 = string1.Substring(index2 + 1);
            String a = DESUtils.DesDecrypt(string2, "");
            connectString = connectString.Replace(string2, a);
            return connectString;
        }
    }
}

第二次,我的想法是找到第一次调用config文件连接密码的地方(这个很容易找到,修改数据库连接密码,报错的地方就是),然后在之前统一做一次解密操作,并将解密后的字符串保存进config文件。这个方案存在很大且很多漏洞,比如一旦解密过以后,测试人员测试之前又得加密一次config文件。造成每次应用运行前后都得加密一遍config文件,因此中断这个解决方案。

查阅各种论坛博客,最后发现了简便加密的方法,原来asp.Net自己就有
以DPAPI方式加密Config!加密过的config文件根本不需要解密,使用的是.net自身的加密,没有自定义的加密规则,但是.net自己加密的配置文件在解密的时候是不需要进行解密的

		/// 
        /// 以DPAPI方式加密Config
        /// 
        private static void EncryptWebConfigByDPAPI()
        {
            Configuration configuration = null;
            ConfigurationSection connectionSection = null;

            //打开Request所在路径网站的Web.config文件
            configuration = WebConfigurationManager.OpenWebConfiguration("~");
            //取得Web.config中connectionStrings设置区块
            connectionSection = configuration.GetSection("connectionStrings");
            //未加密时
            if (!connectionSection.SectionInformation.IsProtected)
            {
                connectionSection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
                configuration.Save();
            }
        }

但是,我一直在思考,加密以后,就不可能进行配置文件密码的修改了,因为你看到的都是加密后的配置文件,所以为了确保未来其他人员的使用,还是将解密也写出来,方便日后进行修改。

//解密
         private static void DecryptWebConfigByDPAPI()
        {
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");   
        ConfigurationSection section = config.GetSection("connectionStrings");   
  
        if (section != null && section.SectionInformation.IsProtected)   
        {   
            section.SectionInformation.UnprotectSection();   
            config.Save();   
        }   
    }   

以上就是结合很多论坛博客找到的方法,当然加密解密算法还有很多,包括与上面相似的RSA算法,但是需要导出密钥,上面的最简单的,安全性没有要求,可以适用。

如果有更简单,有效的方法,以及错误指正欢迎告知。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值