**后续讨论:WinForm工程connectionStrings的加密之后的问题
我的前个问题:
我用的是VS2005,C#的WinForm的程序(客户端),数据库(SQL Server)在服务器上,客户端完成查询等功能,C#程序发布完成后,发现有个xxx.exe.cfg的文件里面connectionStrings有数据用户名和密码,这样就泄露了数据库信息。
在这种情况下,怎么解决??具体方法。要求不用烦琐的手工添加代码。
经过大家的热心回答,总结“juedaihuaihuai(绝代坏坏)”和“ccp5780199(观阴大湿) ”的解答,我的问题已经解决,如下:
我把C#工程app.config改名为web.config放在d:\下,然后用
aspnet_regiis.exe -pef "connectionStrings " "D:\ "
完成加密
再把web.config改回名字app.config覆盖原来的文件。
从新发布或打包,程序安装后,xxx.exe.cfg里的connectionStrings加密了,保护了数据库信息。
给分结果:
juedaihuaihuai(绝代坏坏) 45分--首先提出了上面方法,并给出了加密命令的全路径,给50分,但把加密参数pef错打成了解密参数pdf,酌情减5分^_^,见谅。再次感谢!
ccp5780199(观阴大湿) 回答两次共30分,缺少加密命令的全路径哦,不过第二次给出了解密方法,感谢。
其他人:虽然回答不是我想要的,但是给出了其他思路的朋友,酌情给了些分。
本想多给大家些分,但能力有限。
谢谢大家的热心解答。
言归正传:
上面的问题解决了,但是新的问题是,如果使用我写的软件的用户,知道了这个解密的方法,不是同样可以进行解密,轻易获取我的服务器上数据库的用户名和密码信息吗?? 经我试验也确实如此!
如何解决?思路和具体方法!简单、具体、有效,越好。
(我就奇怪了,为什么用微软的VS2005建立访问数据库的桌面应用程序很方便(用鼠标在控件上设置数据库信息就可以了),但程序发布后,会暴露如此敏感的数据库信息呢!发布时如果能将这种敏感信息嵌入程序内部或自动加密的话,我这样的菜鸟不就会少很多烦恼了吗?o(∩_∩)o...)
只是想讨论讨论。
[解决办法]
那你自己写个加密算法不就可以了阿,这样就让别人猜去吧。不过话说回来,在牛的程序不是也有人破解吗?
[解决办法]
还是自己加密吧,以下是一个加解密的类。
/// <summary>
/// RC2加解密类
/// </summary>
public class RC2_
{
private RC2 rc;
public string Key;
public string IV;
/// <summary>
/// 对称加密类的构造函数
/// </summary>
public RC2_(string key)
{
rc = new RC2CryptoServiceProvider();
Key = key;
IV = "#$^%&&*Yisifhsfjsljfslhgosdshf26382837sdfjskhf97(*&(* ";
}
/// <summary>
/// 对称加密类的构造函数
/// </summary>
public RC2_(string key, string iv)
{
rc = new RC2CryptoServiceProvider();
Key = key;
IV = iv;
}
/// <summary>
/// 获得密钥
/// </summary>
/// <returns> 密钥 </returns>
private byte[] GetLegalKey()
{
string sTemp = Key;
rc.GenerateKey();
byte[] bytTemp = rc.Key;
int KeyLength = bytTemp.Length;
if (sTemp.Length > KeyLength)
sTemp = sTemp.Substring(0, KeyLength);
else if (sTemp.Length < KeyLength)
sTemp = sTemp.PadRight(KeyLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 获得初始向量IV
/// </summary>
/// <returns> 初试向量IV </returns>
private byte[] GetLegalIV()
{
string sTemp = IV;
rc.GenerateIV();
byte[] bytTemp = rc.IV;
int IVLength = bytTemp.Length;
if (sTemp.Length > IVLength)
sTemp = sTemp.Substring(0, IVLength);
else if (sTemp.Length < IVLength)
sTemp = sTemp.PadRight(IVLength, ' ');
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// 加密方法
/// </summary>
/// <param name= "Source "> 待加密的串 </param>
/// <returns> 经过加密的串 </returns>
public string Encrypt(string Source)
{
try
{
byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
MemoryStream ms = new MemoryStream();
rc.Key = GetLegalKey();
rc.IV = GetLegalIV();
ICryptoTransform encrypto = rc.CreateEncryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
ms.Close();
byte[] bytOut = ms.ToArray();
return Convert.ToBase64String(bytOut);
}
catch (Exception ex)
{
throw new Exception( "在文件加密的时候出现错误!错误提示: \n " + ex.Message);
}
}
/// <summary>
/// 解密方法
/// </summary>
/// <param name= "Source "> 待解密的串 </param>
/// <returns> 经过解密的串 </returns>
public string Decrypt(string Source)
{
try
{
byte[] bytIn = Convert.FromBase64String(Source);
MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
rc.Key = GetLegalKey();
rc.IV = GetLegalIV();
ICryptoTransform encrypto = rc.CreateDecryptor();
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
catch (Exception ex)
{
throw new Exception( "在文件解密的时候出现错误!错误提示: \n " + ex.Message);
}
}
}
[解决办法]
连接数据库字符串写在另外一个件里,保存成xxx.bat格式
[解决办法]
没有这种情况啊,纯粹是你自己的问题而已
[解决办法]
up
[解决办法]
http://community.csdn.net/Expert/topic/5722/5722832.xml
LZ说的是这个吧?
我已经回复了:
---------------------------------------------------
wuyi8808() (☆☆) 信誉:119 2007-8-23 21:27:57 得分: 0
郁闷! 就算是加密了...
其他人可以用同样的方法( aspnet_regiis -pdf "配置节 " "目录 " )把你的配置文件破解啊....
还更安全的吗???
[解决办法]
看看MSDN的Security Configuration Section这一节吧,这就是你要找的。
[解决办法]
标记
[解决办法]
这个..简单的方法,自己写加密,但是,你要是问,那如果别人知道了你的算法,不也就破解了么?我就没法回答了...
想要灵活的使用配置文件,但是又担心被别人访问..你那么做就失去了配置文件的灵活性,那还不如写在程序里硬编码呢.
[解决办法]
加密过程中使用了一个基于本机的密钥,所以解密过程也必须在同一台计算机上完成。如果将加密的app.config文件移动到其他计算机解密将不能正常解密。楼主可以试一下!