admin管理员组文章数量:1589959
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文件根本不需要解密,使用的是自身的加密,没有自定义的加密规则,但是自己加密的配置文件在解密的时候是不需要进行解密的
///
/// 以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算法,但是需要导出密钥,上面的最简单的,安全性没有要求,可以适用。
如果有更简单,有效的方法,以及错误指正欢迎告知。
版权声明:本文标题:ASP.NET~~[ Web.config文件加密]~Fortify扫描 Password Management: Password in Configuration File 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728074925a1144363.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论