日期:2014-05-18  浏览次数:21052 次

**后续讨论: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 na